Как добавить путь к домашнему каталогу, который должен обнаружить Unix, какой командой?

12

Я установил node.jsв произвольном месте и добавил местоположение $PATHв .profileфайл.

$ 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 работает хорошо. Проблема состоит в том, что это не перечислено whichкомандой. Так что я не могу установить npmсейчас. Поскольку npmустановка не может найти местоположение node.js. Как я могу сделать nodeбинарный файл обнаруженным which?

Eonil
источник

Ответы:

11

Это происходит потому, ~что не был расширен. Ваша оболочка знает, как с этим справиться, но whichне знает (как и большинство других программ). Вместо этого сделайте:

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

Кроме того, прекратить использование whichи использовать (почти всегда лучше) type -p.

Вот демонстрация проблемы:

$ 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

Имейте в виду, что некоторые другие программы, которые смотрят, $PATHмогут не понимать значение того и ~другого, и воспринимать это как часть относительного пути. Это более портативный в использовании $HOME.

Крис Даун
источник
1
Хотя предлагаемое решение работает, объяснение неверно. whichздесь не виноват; ~должны были расширены в определении PATH. В bash есть странность, что в ~любом случае она расширяется PATH, поэтому два вида ошибок делают правильное, своего рода.
Жиль "ТАК - прекрати быть злым"
@ Жиль Как это отличается от того, что я сказал?
Крис Даун
Тот факт, что это работает вообще с цитируемым, ~странная странность. Имея , что буквальные ~ин $PATHможет вызвать проблемы вниз линию , потому что есть программы , которые делают свои собственные расщеплению , $PATHи они не относятся к ~специально.
Жиль "ТАК - перестань быть злым"
@ Жиль ... а чем это отличается от того, что я сказал в своем последнем абзаце?
Крис Даун
1
Хотя технически верно, что «какая-то другая программа… может не понимать значение ~», ваше предложение вводит в заблуждение. В контексте $PATH, это каждая программа, кроме bash.
Жиль "ТАК - перестань быть злым"
18

Эта строка в вашем .profileдолжно быть одним из

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

Символ ~раскрывается только до вашего домашнего каталога, когда он является первым символом слова и не заключен в кавычки. В том, что вы написали, ~находится между двойными кавычками и поэтому не раскрывается. Даже если вы написали export "PATH=$PATH:"~/Unix/homebrew/bin, ~оно не будет расширено, потому что оно не находится в начале слова оболочки.

Существует специальное разрешение, которое предназначено для записи значений PATHи аналогичных переменных. Если ~сразу после знака равенства, который обозначает назначение, или если ~сразу после a :в правой части назначения, то он расширяется. Только обычные присваивания имеют эту диспенсацию, export PATH=…не считаются (это вызов exportвстроенной функции, в которой есть аргумент, содержащий =символ).

Здесь вам не нужно экспортировать, PATHпотому что он уже экспортирован. Вам не нужно вызывать, exportкогда вы изменяете значение переменной (за исключением старых оболочек Борна, которых вы не найдете в OSX или Linux). Кроме того, в задании (опять же, exportне в счет) вам не нужны двойные кавычки вокруг правой части, поэтому PATH=$PATH:~/Unix/homebrew/binэто безопасно, даже если $PATHсодержит пробелы.

Жиль "ТАК - прекрати быть злым"
источник