Saya mengeksekusi di shell Ubuntu 12,04 perintah berikut:
sudo bash -c "echo $PATH; which python"
yang menampilkan sesuatu seperti
/home/me/env/develop/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
/usr/bin/python
dan perintah berikut
ls /home/me/env/develop/bin
displys (amont others)
python
Menurut man
halaman which
perintah mencari executable yang diberikan di semua jalur yang didefinisikan dalam PATH
. The man
halaman tidak ketat menentukan 'pesanan' dari pencarian, namun biasanya ia pergi dari awal sampai akhir PATH
variabel lingkungan.
Sekarang, path /home/me/env/develop/bin
berisi python executable (mode diatur dengan benar, bukan tautan simbolik), yang juga merupakan path pertama di PATH
. Tetapi which
perintah menampilkan lokasi yang sama sekali berbeda!
Mengapa demikian? Saya melakukan sesuatu yang bodoh? Apakah ini secara ajaib ada hubungannya sudo
? Apakah ini bug?
type
sebagai gantiwhich
Jawaban:
Itu bukan bug.
$PATH
dalam tanda kutip ganda akan diperluas oleh shell Andabash -c
bahkan sebelum melihatnya.Ini artinya, Anda akan benar-benar menjalankan:
Tes kecil:
Untuk sampai ke akar masalah Anda, jalankan:
Ini tidak akan diperluas
$PATH
sebelumnya.Solusi untuk masalah jalur Anda adalah dengan menetapkan jalur di Anda
.bashrc
alih-alih.bash_profile
— itu adalah jika saya berasumsi jalur Anda ditetapkan dengan benar di sana — sehingga itu dimuat bahkan untuk shell non-login (seperti padabash -c
). Atau Anda jalankanbash -lc
agar menjalankan shell login sebagai gantinya, yang akan memuat.bash_profile
.sumber