Ich versuche, den anderen Teil des Nvidia cuda-Bibliotheksinstallationsprogramms zu extrahieren. Ich benutze den folgenden Befehl:
mkdir ~/Downloads/nvidia_installers
./cuda_6.5.14_linux_64.run -extract=~/Downloads/nvidia_installers
Und ich bekomme folgende Meldung:
ERROR: extract: path must be absolute.
Und wenn ich den Befehl mit der wörtlichen Adresse meines Hauses eingebe, funktioniert er perfekt.
./cuda_6.5.14_linux_64.run -extract=/home/likewise-open/XXX/username/Downloads/nvidia_installers
Ich bin verwirrt, sollte ~ nicht mit / home / ebenfalls-open / XXX / username identisch sein?
Geprüft:
./cuda_6.5.14_linux_64.run -extract=$HOME/Downloads/nvidia_installers
und es funktioniert, aber ich weiß nicht, warum es nicht erlaubt ~
command-line
paths
Regan
quelle
quelle
Antworten:
Bash erweitert ein ~ nur, wenn es der Anfang eines Wortes ist. Sie können dies zwischen den folgenden Befehlen sehen:
Bash sucht nach eigenständigen
~
Zeichen und~/
nach dieser Ersetzung. Keine andere Kombination oder zitierte Version wird funktionieren.$HOME
funktioniert, weil variable Substitutionen robuster sind (das$
ist ein Sonderzeichen, wohingegen~
es sehr viel weniger ist):Während wir darüber reden
~
, hat es tatsächlich noch ein paar andere Substitutionsmöglichkeiten:~+
das aktuelle Arbeitsverzeichnis (gelesen von$PWD
)~-
das vorherige Arbeitsverzeichnis (gelesen von$OLDPWD
)Wie bei plain
~
können diese am Ende zusätzliche Pfade haben, und diese müssen wiederum das Präfix eines Wortes sein, oder Bash ignoriert sie.Mehr dazu lesen Sie in
man bash | less -p ' Tilde'
quelle
zsh
auch~
nachher expandiert (oder vielmehr konfiguriert werden kann)=
. Unter anderen praktischen Verbesserungen hat es über Bash.=
; es geht darum, am anfang der rechten seite eine variable zuordnung zu erweitern. Das macht unseren Fall bei näherer Betrachtung etwas verwirrender - siehe meine Antwort. Und unterscheidetzsh
sich darin nichtbash
; Die Beschreibung für 'zsh' ist ein wenig kryptisch:info --subnodes zsh | less +/'14.7.4 Notes'
(zsh Manpages fehlen)zsh
ist sehr konfigurierbar. In meinem zshecho -extract=~/test
ergibt sich-extract=/home/user/test
. Es wird durchMAGIC_EQUAL_SUBST
Optionen aktiviert . Als Randnotiz habe ich alle zsh-Manpages ganz gut.zsh
konfigurierbar - und andere Verbesserungen; Ich hätte erwartet, dass MAGIC_EQUAL_SUBST (in 14.7.4 behandelt) standardmäßig deaktiviert und selten verwendet wird. Jetzt ist es offensichtlich relevanter, wenn Sie es allgemein aktiviert haben. Nachdem ich meine Beispielsektion in einen guten Zustand gebracht habe, wäre das eine schöne Ergänzung ...Ich repariere es einfach
Dieser Befehl zeigt eine Fehlermeldung "ERROR: extract: path must be absolute" an:
Der Fehler ist nicht hilfreich - das Programm war bereits zu verwirrt.
Sie wissen bereits, dass der Fehler vom liegt
~
, da er$HOME
stattdessen mit funktioniert .Das Problem:
~
Wird nur am Anfang eines Wortes ersetzt.Dies funktioniert zum Beispiel mit der Tilde:
Wenn Sie die Optionssyntax mit benötigen
=
, ist die Verwendung von $ HOME anstelle von~
die sauberste Lösung.Die Übung
Was du wissen solltest:
Es gibt spezielle Fälle, in
~
denen nicht am Anfang eines Wortes erweitert wird: als Teil einer variablen Zuweisung, direkt nach dem=
. Was hier natürlich verwirrend ist.Der andere wichtige Spezialfall ist die Verwendung mit Variablen wie PATH. Bei variablen Zuweisungen
~
wird auch nach:
, wie nach dem ersten, erweitert=
.Die Bedeutung der Tilde
In einer Shell ist
~
die Tilde nicht wirklich ein Pfad. Es wird nur gelegentlich durch einen Pfad ersetzt$HOME
.Es ist so etwas wie eine Abkürzung, die von der Shell bereitgestellt wird.
Es kann im Allgemeinen nicht wie ein Pfad verwendet werden, die Shell "erweitert" es nur an ganz bestimmten Stellen zu einem Pfad.
Und selbst wenn es erweitert ist, kann es sich um etwas anderes als das Basisverzeichnis handeln.
:
oder erweitert=
$HOME
wenn das Wort vor a keine weiteren Zeichen enthält/
Das Problem in der Kommandozeile
Demnach besteht das Problem in Ihrem Befehl darin, dass die Tilde in
-extract=~/Downloads/nvidia_installers
wird nicht erweitert, da es sich nicht um einen der aufgelisteten Fälle handelt. Das ist alles.
Die Lösung könnte darin bestehen, die Tilde zum ersten nicht in Anführungszeichen gesetzten Zeichen eines Wortes zu machen, ohne dass ein anderes Zeichen vor dem nächsten steht
/
- genau das erhalten Sie, wenn Sie eine Option mit einem Leerzeichen vor dem Optionsargument verwenden:-extract ~/Downloads/nvidia_installers
Eine andere Lösung wäre,
$HOME
stattdessen zu verwenden . In einem Skript ist das normalerweise die bessere Wahl.-extract=$HOME/Downloads/nvidia_installers
Die Fehlermeldung
Aber wie sieht die Fehlermeldung aus
"ERROR: extract: path must be absolute."
?in all das passen?
Wir wissen, dass die Tilde nicht erweitert wurde. Das heißt, das Programm hat den Argumenttext einschließlich
~
, aber ohne/home/auser
als Pfad erhalten. Dieser Pfad ist~/Downloads/nvidia_installers
- aber jetzt gibt es keine Muschel, daher hat die Tilde keine besondere Bedeutung. Es ist nur ein normaler Verzeichnisname. Und wie jeder andere Pfad der Formfoo/bar/baz
ist es ein relativer PfadAndere Verwendungen
Wenn es Zeichen nach dem sind
~
, wie in~alice
- mit allen anderen Regeln über die Anwendung - und es gibt einen Benutzernamenalice
, die auf dem Home - Verzeichnis erweitert wirdalice
stattdessen sagenhome/alice
.Wenn Sie dies tun
bob
,~
erweitern Sie auf/home/bob
und~bob
erweitern Sie auf dasselbe.Die Variante
~+
wird zum aktuellen Verzeichnis erweitert.$PWD
Um auf das vorherige Verzeichnis zu verweisen, in dem Sie sich vor dem letzten befanden
cd
, können Sie das Verzeichnis verwenden~-
, auf das erweitert wird$OLDPWD
.Wenn Sie
pushd
undpopd
anstelle von verwendencd
, wissen Sie bereits, dass auf den Verzeichnisstapel wie folgt zugegriffen werden kann~-2
.Einzelheiten
Alle Fälle, in denen
~
ein Pfad erweitert wird, werden von der Shell behandelt . Bei anderen Programmen~
ist dies nur ein normaler Dateiname.Für die genaue Definition innerhalb der Shell ist hier der relevante Abschnitt von Hinweis, wie das Ersetzen durch nur ein Sonderfall von vielen Fällen ist: "Wenn dieser Anmeldename die Nullzeichenfolge ist, wird die Tilde durch den Wert des Shellparameters HOME ersetzt. " :
man bash
~
$HOME
quelle
~
ist kein Weg an sich. Es ist ein Charakter, der eine spezielle Behandlung von der Shell erhält, bei der~
oder~/
bedeutet "Ersetzen durch den Heimatverzeichnispfad des aktuellen Benutzers".~username
bedeutet "durch den Heimatverzeichnispfad des Benutzernamens ersetzen".Da es sich nicht um einen Pfad handelt, wird er nur an bestimmten Stellen im Befehl erkannt (als erstes Zeichen eines neuen Space-Split-Tokens).
Wenn es erweitert wird, wird es durch einen absoluten Pfad ersetzt.
Verwenden von
$HOME
Works, da HOME nur eine von der Shell festgelegte Variable ist und die normalen Shell-Regeln für das Ersetzen von Variablen befolgt (dies geschieht, bevor die Eingabe in Leerzeichen aufgeteilt und ausgeführt wird).quelle
Du hast Recht. Das ~ / Downloads ist dasselbe wie / home / username / Downloads.
Einige Installateure und Extraktoren sind nur sehr wählerisch, wo sie Dinge platzieren müssen. Ich denke, es könnte daran liegen, dass die Dateipfade protokolliert werden und die Protokolle ~ in einem akzeptierten Pfad nicht akzeptieren.
Ich habe mich nur daran gewöhnt, stattdessen / home / username einzugeben. :)
quelle