Como adicionar o caminho do diretório inicial a ser descoberto pelo Unix, qual comando?

12

Eu tenho instalado node.jsno local personalizado e acrescentou o local para o $PATHno .profilearquivo.

$ 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"

O próprio Node.js roda bem. O problema é que não está listado por whichcomando. Portanto, não posso instalar npmagora. Porque a npminstalação não consegue encontrar a localização de node.js. Como posso fazer com que o nodebinário seja descoberto which?

Eonil
fonte

Respostas:

11

Isso está acontecendo porque ~não foi expandido. Seu shell sabe como lidar com isso, mas whichnão o faz (nem a maioria dos outros programas). Em vez disso, faça:

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

Como alternativa, pare de usar whiche use o (quase sempre superior) type -p.

Aqui está uma demonstração do problema:

$ 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

Lembre-se de que alguns outros programas analisados $PATHpodem não entender o significado de ~nenhum deles e considerá-lo parte de um caminho relativo. É mais portátil de usar $HOME.

Chris Down
fonte
1
Enquanto a solução proposta funciona, a explicação está errada. whichnão tem culpa aqui; o ~deveria ter sido expandido na definição de PATH. Há uma estranheza no bash em que ele se expande de ~qualquer maneira PATH, então dois erros fazem o certo, mais ou menos.
Gilles 'SO- stop be evil'
@Gilles Como isso difere do que eu disse?
Chris Baixo
O fato de que isso funciona com o citado ~é uma estranheza do bash. Ter esse literal ~em $PATHé susceptível de causar problemas para baixo da linha porque existem programas que fazem a sua própria divisão de $PATHe eles não tratam ~especificamente.
Gilles 'SO- stop be evil'
@ Gilles ... e como isso difere do que eu disse no meu parágrafo final?
Chris Baixo
1
Embora seja tecnicamente verdade que "algum outro programa ... talvez não entenda o significado de ~", sua frase é enganosa. No contexto de $PATH, este é todo programa que não seja o bash.
Gilles 'SO- stop be evil'
18

Essa linha no seu .profiledeve ser um dos

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

O ~caractere só é expandido para o diretório inicial quando é o primeiro caractere de uma palavra e não está entre aspas. No que você escreveu, ~é entre aspas duplas e, portanto, não é expandido. Mesmo se você escrevesse export "PATH=$PATH:"~/Unix/homebrew/bin, o ~não seria expandido porque não está no início de uma palavra shell.

Existe uma dispensação especial, cujo objetivo é escrever valores para PATHe variáveis ​​semelhantes. Se ~for logo após o sinal de igual que marca uma tarefa, ou se ~for logo após a :no lado direito de uma tarefa, será expandido. Apenas atribuições simples têm essa dispensação, export PATH=…não contam (é uma chamada para o exportbuiltin, que por acaso tem um argumento que contém um =caractere).

Aqui, você não precisa exportar PATHporque já foi exportado. Você não precisa ligar exportquando altera o valor de uma variável (exceto nos antigos shell Bourne que você não encontrará no OSX ou Linux). Além disso, em uma tarefa (novamente, exportnão conta), você não precisa de aspas duplas no lado direito, portanto PATH=$PATH:~/Unix/homebrew/biné seguro mesmo que $PATHcontenha espaços.

Gilles 'SO- parar de ser mau'
fonte