Bagaimana cara menambahkan direktori home path untuk ditemukan oleh Unix perintah mana?

12

Saya telah menginstal node.jsdi lokasi khusus dan menambahkan lokasi ke file $PATHdalam .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 sendiri berjalan dengan baik. Masalahnya adalah tidak terdaftar berdasarkan whichperintah. Jadi saya tidak bisa menginstal npmsekarang. Karena npminstal tidak dapat menemukan lokasi node.js. Bagaimana saya bisa membuat nodebiner ditemukan oleh which?

Eonil
sumber

Jawaban:

11

Ini terjadi karena ~belum diperluas. Shell Anda tahu cara menghadapinya, tetapi whichtidak (sebagian besar program lain juga tidak) Sebaliknya, lakukan:

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

Atau, hentikan penggunaan which, dan gunakan (hampir selalu superior) type -p.

Berikut ini adalah contoh masalah:

$ 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

Ingatlah bahwa beberapa program lain yang melihat $PATHmungkin tidak memahami arti ~keduanya, dan menganggapnya sebagai bagian dari jalur relatif. Ini lebih portabel untuk digunakan $HOME.

Chris Down
sumber
1
Sementara solusi yang diajukan berhasil, penjelasannya salah. whichtidak bersalah di sini; yang ~seharusnya diperluas dalam definisi PATH. Ada keanehan di bash bahwa itu ~tetap memperluas PATH, jadi dua kesalahan membuat hak, semacam.
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles Apa bedanya dengan apa yang saya katakan?
Chris Down
Fakta bahwa ini bekerja sama sekali dengan dikutip ~adalah keanehan bash. Memiliki yang literal ~dalam $PATHkemungkinan penyebab masalah bawah garis karena ada program yang melakukan pemisahan mereka sendiri $PATHdan mereka tidak memperlakukan ~khusus.
Gilles 'SANGAT berhenti menjadi jahat'
@Gilles ... dan apa bedanya dengan apa yang saya katakan di paragraf terakhir saya?
Chris Down
1
Meskipun secara teknis benar bahwa "beberapa program lain ... mungkin tidak mengerti arti ~", kalimat Anda menyesatkan. Dalam konteks $PATH, ini adalah setiap program selain bash.
Gilles 'SANGAT berhenti menjadi jahat'
18

Baris itu di Anda .profileharus menjadi salah satu

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

The ~karakter hanya diperluas ke direktori home Anda ketika itu karakter pertama dari sebuah kata dan itu kuotasi. Dalam apa yang Anda tulis, ~ada di antara tanda kutip ganda dan karenanya tidak diperluas. Bahkan jika Anda menulis export "PATH=$PATH:"~/Unix/homebrew/bin, ~itu tidak akan diperluas karena itu bukan pada awal kata shell.

Ada dispensasi khusus, yang dimaksudkan untuk menulis nilai untuk PATHdan variabel sejenis. Jika ~tepat setelah tanda sama dengan yang menandai tugas, atau jika ~hanya setelah tanda :di sisi kanan tugas, maka itu diperluas. Hanya tugas sederhana yang memiliki dispensasi ini, export PATH=…tidak masuk hitungan (ini adalah panggilan ke exportbuiltin, yang kebetulan memiliki argumen yang berisi =karakter).

Di sini, Anda tidak perlu mengekspor PATHkarena sudah diekspor. Anda tidak perlu menelepon exportsaat Anda mengubah nilai variabel (kecuali di shell Bourne lama yang tidak akan Anda temukan di OSX atau Linux). Juga, dalam tugas (sekali lagi, exporttidak masuk hitungan), Anda tidak perlu tanda kutip ganda di sisi kanan, jadi PATH=$PATH:~/Unix/homebrew/binaman bahkan jika $PATHberisi spasi.

Gilles 'SANGAT berhenti menjadi jahat'
sumber