Come aggiungere il percorso della directory home da scoprire con Unix quale comando?


12

Ho installato node.jsin posizione personalizzata e ha aggiunto la posizione al $PATHdi .profilefile.

$ 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 stesso funziona bene. Il problema è che non è elencato dal whichcomando. Quindi non posso installare npmora. Perché npminstall non riesce a trovare la posizione di node.js. Come posso fare il nodebinario scoperto da which?

Risposte:


11

Questo sta accadendo perché ~non è stato ampliato. La tua shell sa come gestirlo, ma whichnon lo fa (e nemmeno la maggior parte degli altri programmi). Invece, fai:

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

In alternativa, smetti di usare whiche usa (quasi sempre superiore) type -p.

Ecco una dimostrazione 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

Tieni presente che alcuni altri programmi che guardano $PATHpotrebbero non comprendere il significato di ~nessuno dei due e prenderlo come parte di un percorso relativo. È più portatile da usare $HOME.


1
Mentre la soluzione proposta funziona, la spiegazione è errata. whichnon è colpa qui; l' ~avrebbe dovuto essere ampliato nella definizione di PATH. C'è una stranezza in Bash in cui si espande ~comunque PATH, quindi due errori fanno un giusto, tipo di.
Gilles 'SO- smetti di essere malvagio' il

@Gilles In cosa differisce da quello che ho detto?
Chris Down,

Il fatto che questo funzioni con il citato ~è una strana stranezza. Avere che letterale ~in $PATHè probabile che a causare problemi lungo la linea, perché ci sono programmi che fanno il loro frazionamento $PATHe non trattano ~in modo speciale.
Gilles 'SO- smetti di essere malvagio' il

@Gilles ... e in cosa differisce da quello che ho detto nel mio ultimo paragrafo?
Chris Down,

1
Mentre è tecnicamente vero che "qualche altro programma ... potrebbe non capire il significato di ~", la tua frase è fuorviante. Nel contesto di $PATH, questo è ogni programma diverso da bash.
Gilles 'SO- smetti di essere malvagio' il

18

Quella linea nella tua .profiledovrebbe essere una delle

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

Il ~carattere viene espanso nella directory principale solo quando è il primo carattere di una parola e non è citato. In quello che hai scritto, ~è tra virgolette doppie e quindi non espanso. Anche se hai scritto export "PATH=$PATH:"~/Unix/homebrew/bin, ~non verrebbe espanso perché non è all'inizio di una parola shell.

Esiste una dispensa speciale, che ha lo scopo di scrivere valori per PATHe variabili simili. Se ~è subito dopo il segno di uguale che segna un compito, o se ~è subito dopo a :nella parte destra di un compito, allora è espanso. Solo le assegnazioni semplici hanno questa dispensazione, export PATH=…non conta (è una chiamata all'integrato export, che sembra avere un argomento che contiene un =carattere).

Qui, non è necessario esportare PATHperché è già esportato. Non è necessario chiamare exportquando si modifica il valore di una variabile (tranne nelle vecchie shell Bourne che non si trovano su OSX o Linux). Inoltre, in un compito (di nuovo, exportnon conta), non hai bisogno di doppie virgolette attorno al lato destro, quindi PATH=$PATH:~/Unix/homebrew/binè sicuro anche se $PATHcontiene spazi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.