Wie füge ich den von Unix zu erkennenden Home-Verzeichnis-Pfad hinzu, welcher Befehl?

12

Ich habe node.jsam benutzerdefinierten Speicherort installiert und den Speicherort zur $PATHIn- .profileDatei hinzugefügt .

$ node --version
v0.6.2
$ which node
$ echo $PATH
/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:~/Unix/homebrew/bin
$ cat ~/.profile
export  PATH="$PATH:~/Unix/homebrew/bin"

Node.js selbst läuft gut. Das Problem ist, dass es nicht per whichBefehl aufgelistet wird . Also kann ich npmjetzt nicht installieren . Weil npminstall den Speicherort von nicht finden kann node.js. Wie kann ich die nodeBinärdatei von entdecken lassen which?

Eonil
quelle

Antworten:

11

Dies geschieht, weil ~es nicht erweitert wurde. Ihre Shell weiß, wie man damit umgeht, weiß es aber whichnicht (und die meisten anderen Programme auch nicht). Tun Sie stattdessen:

export "PATH+=:$HOME/Unix/homebrew/bin"

Alternativ können Sie die Verwendung beenden whichund die (fast immer überlegene) verwenden type -p.

Hier ist eine Demonstration des Problems:

$ echo "$PATH"
/usr/local/bin:/usr/bin:/bin
$ export "PATH+=:~/git/yturl"
$ yturl
Usage: yturl id [itag ...]
$ which yturl
$ type -p yturl
/home/chris/git/yturl/yturl
$ export "PATH=/usr/local/bin:/usr/bin:/bin:$HOME/git/yturl"
$ which yturl
/home/chris/git/yturl/yturl

Denken Sie daran, dass einige andere Programme, die sich ansehen, $PATHmöglicherweise die Bedeutung von ~beiden nicht verstehen , und nehmen Sie sie als Teil eines relativen Pfades. Es ist tragbarer zu bedienen $HOME.

Chris Down
quelle
1
Während die vorgeschlagene Lösung funktioniert, ist die Erklärung falsch. whichist hier nicht schuld; das ~hätte in der Definition von erweitert werden sollen PATH. Es gibt eine Kuriosität in Bash, dass es das ~ohnehin erweitert PATH, also machen zwei Fehler eine Art Recht.
Gilles 'SO - hör auf böse zu sein'
@ Gilles Wie unterscheidet sich das von dem, was ich gesagt habe?
Chris Down
Die Tatsache, dass dies überhaupt mit dem Zitierten funktioniert, ~ist eine Bash-Kuriosität. Diese wörtliche Nachdem ~in $PATHwahrscheinlich Ursache in die Bredouille , weil es Programme gibt, die ihre eigene Spaltung tun von $PATHund sie nicht behandeln ~speziell.
Gilles 'SO - hör auf böse zu sein'
@ Gilles ... und wie unterscheidet sich das von dem, was ich in meinem letzten Absatz gesagt habe?
Chris Down
1
Während es technisch wahr ist, dass „ein anderes Programm… die Bedeutung von möglicherweise nicht versteht ~“, ist Ihr Satz irreführend. Im Kontext von $PATHist dies jedes andere Programm als Bash.
Gilles 'SO - hör auf böse zu sein'
18

Diese Zeile in Ihrer .profilesollte eine von sein

export  PATH="$PATH:$HOME/Unix/homebrew/bin"
PATH="$PATH:$HOME/Unix/homebrew/bin"
PATH=$PATH:$HOME/Unix/homebrew/bin
PATH=$PATH:~/Unix/homebrew/bin

Das ~Zeichen wird nur dann in Ihr Home-Verzeichnis erweitert, wenn es das erste Zeichen eines Wortes ist und nicht in Anführungszeichen steht. In dem, was Sie geschrieben haben, ~steht das zwischen doppelten Anführungszeichen und ist daher nicht erweitert. Selbst wenn Sie geschrieben haben export "PATH=$PATH:"~/Unix/homebrew/bin, wird das ~nicht erweitert, da es nicht am Anfang eines Shell-Wortes steht.

Es gibt eine spezielle Abgabe, mit der Werte für PATHund ähnliche Variablen geschrieben werden sollen. Wenn ~es sich direkt um das Gleichheitszeichen handelt, das eine Zuweisung kennzeichnet, oder wenn ~es sich direkt nach a :auf der rechten Seite einer Zuweisung befindet, wird es erweitert. Nur einfache Zuweisungen haben diese Dispensation, export PATH=…zählen nicht (es ist ein Aufruf an den exporteingebauten, der zufällig ein Argument hat, das ein =Zeichen enthält ).

Hier müssen Sie nicht exportieren, PATHda es bereits exportiert wurde. Sie müssen nicht aufrufen, exportwenn Sie den Wert einer Variablen ändern (außer in alten Bourne-Shells, die Sie unter OSX oder Linux nicht finden). Außerdem exportbenötigen Sie in einer Zuweisung (zählt wiederum nicht) keine doppelten Anführungszeichen auf der rechten Seite, sodass dies PATH=$PATH:~/Unix/homebrew/binauch dann sicher ist, wenn $PATHLeerzeichen enthalten sind.

Gilles 'SO - hör auf böse zu sein'
quelle