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

11

Instalei node.js no local personalizado e adicionei o local ao arquivo $PATH in .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"

O próprio Node.js é executado corretamente. O problema é que ele não está listado pelo comando which . Portanto, não posso instalar npm agora. Porque npm install não consegue encontrar a localização de node.js . Como posso tornar o binário node descoberto por which ?

    
por Eonil 29.11.2011 / 02:50

2 respostas

10

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

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

Como alternativa, pare de usar which e use (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 que olham para $PATH podem não entender o significado de ~ e tomá-lo como parte de um caminho relativo. É mais portável usar $HOME .

    
por 29.11.2011 / 04:00
18

Essa linha no seu .profile deve ser uma das

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 seu diretório pessoal quando é o primeiro caractere de uma palavra e não é citada. No que você escreveu, o ~ é entre aspas duplas e, portanto, não é expandido. Mesmo se você escreveu 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, destinada a escrever valores para PATH e variáveis semelhantes. Se ~ for logo após o sinal de igual que marca uma atribuição, ou se ~ for logo após um : no lado direito de uma atribuição, ele será expandido. Apenas atribuições simples têm essa dispensação, export PATH=… não conta (é uma chamada para o export builtin, que por acaso tem um argumento que contém um caractere = ).

Aqui, você não precisa exportar PATH porque já foi exportado. Você não precisa chamar export quando alterar o valor de uma variável (exceto em shells antigos da Bourne que você não encontrará no OSX ou no Linux). Além disso, em uma atribuição (novamente, export não conta), você não precisa de aspas duplas no lado direito, portanto, PATH=$PATH:~/Unix/homebrew/bin é seguro, mesmo se $PATH contiver espaços.

    
por 29.11.2011 / 22:50