¿Cómo agregar la ruta del directorio de inicio para que Unix descubra qué comando?

12

He instalado node.jsen la ubicación personalizada y ha añadido la localización a la $PATHde .profilearchivo.

$ 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 en sí funciona bien. El problema es que no está listado por whichcomando. Entonces no puedo instalar npmahora. Porque npminstalar no puede encontrar la ubicación de node.js. ¿Cómo puedo hacer que el nodebinario sea descubierto por which?

Eonil
fuente

Respuestas:

11

Esto está sucediendo porque ~no se ha ampliado. Su shell sabe cómo lidiar con esto, pero whichno (ni la mayoría de los otros programas). En cambio, haz:

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

Alternativamente, deje de usar whichy use el (casi siempre superior) type -p.

Aquí hay una demostración del 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

Tenga en cuenta que algunos otros programas que analizan $PATHpueden no comprender el significado de ~ninguno de los dos, y lo toman como parte de un camino relativo. Es más portátil de usar $HOME.

Chris Down
fuente
1
Si bien la solución propuesta funciona, la explicación es incorrecta. whichno tiene la culpa aquí; el ~debería haberse ampliado en la definición de PATH. Hay una rareza en bash en la que se expande de ~todos modos PATH, por lo que dos errores hacen un correcto, más o menos.
Gilles 'SO- deja de ser malvado'
@Gilles ¿Cómo difiere eso de lo que dije?
Chris Down
El hecho de que esto funcione en absoluto con lo citado ~es una extraña rareza. Es probable que tener ese literal ~adentro $PATHcause problemas más adelante porque hay programas que se dividen por $PATHsí mismos y no los tratan ~especialmente.
Gilles 'SO- deja de ser malvado'
@Gilles ... ¿y cómo difiere eso de lo que dije en mi párrafo final?
Chris Down
1
Si bien es técnicamente cierto que "algún otro programa ... puede no entender el significado de ~", su oración es engañosa. En el contexto de $PATH, este es cada programa que no sea bash.
Gilles 'SO- deja de ser malvado'
18

Esa línea en tu .profiledebería ser una de

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

El ~carácter solo se expande a su directorio de inicio cuando es el primer carácter de una palabra y no está entre comillas. En lo que escribió, el ~es entre comillas dobles y, por lo tanto, no se expande. Incluso si escribió export "PATH=$PATH:"~/Unix/homebrew/bin, el ~no se expandiría porque no está al comienzo de una palabra de shell.

Hay una dispensación especial, que está destinada a escribir valores PATHy variables similares. Si ~está justo después del signo igual que marca una tarea, o si ~está justo después de un :en el lado derecho de una tarea, entonces se expande. Solo las asignaciones simples tienen esta dispensación, export PATH=…no cuenta (es una llamada al exportbuiltin, que tiene un argumento que contiene un =carácter).

Aquí, no necesita exportar PATHporque ya se ha exportado. No necesita llamar exportcuando cambia el valor de una variable (excepto en los antiguos shells Bourne que no encontrará en OSX o Linux). Además, en una tarea (de nuevo, exportno cuenta), no necesita comillas dobles alrededor del lado derecho, por lo que PATH=$PATH:~/Unix/homebrew/bines seguro incluso si $PATHcontiene espacios.

Gilles 'SO- deja de ser malvado'
fuente