Ketika sebuah file dieksekusi, bagaimana cara Unix mencarinya? Jika ada beberapa file yang dapat dieksekusi di PATH dengan nama yang sama, mana yang lebih disukai? Apakah direktori saat ini termasuk dalam pencarian ketika file dieksekusi?
Misalkan ada file dengan nama executable.sh
di direktori saat ini. Apakah itu akan berhasil jika dijalankan $ executed
dan .
bukan bagian dari PATH
?
which <executable>
perintah akan bermanfaat di utas ini.Jawaban:
$ PATH dicari dari awal hingga akhir, dengan eksekusi yang cocok pertama dijalankan. Jadi direktori pada awal $ PATH diutamakan daripada yang datang kemudian. File executable di direktori saat ini (.) Hanya dieksekusi jika. ada dalam $ PATH (yang biasanya tidak ). Tidak ada penyertaan implisit dari direktori saat ini di jalur pencarian.
sumber
.
, tetapi tampaknya akan mencari dari direktori saat ini terlebih dahulu, sebelum memeriksa direktori yang ditetapkan dalam $ PATH itu sendiri.Untuk file dalam direktori saat ini, Anda harus mendahului mereka
./
, sehingga perintahnya menjadi./executable.sh
. Anda tidak boleh memiliki.
di PATH Anda karena menimbulkan risiko keamanan, di antara masalah lainnya.Direktori yang lebih dulu ada di PATH dan dicari terlebih dahulu.
Urutan keseluruhan untuk pencarian adalah seperti ini jika saya ingat dengan benar:
alias
fungsi yang diekspor
perintah shell bawaan
skrip dan binari di PATH Anda
sumber
hash -r
) jika Anda mengubah PATH atau lokasi program Anda.Meskipun ini telah dijawab dengan baik oleh beberapa orang lain, saya ingin menambahkan beberapa pemikiran:
1) PATH hanya dikonsultasikan jika executable yang dipanggil tidak memiliki elemen path di dalamnya. somecommand akan dicari dalam $ PATH,
./somecommand
atau/usr/bin/somecommand
, atau../../bin/somecommand
hanya menggunakan aturan direktori, bukan PATHItu berhenti pada yang pertama ia temukan, membaca $ PATH kiri ke kanan.
Jika direktori saat ini di PATH maka itu dicari. Ingatlah bahwa direktori kosong di PATH termasuk direktori saat ini. mis. PATH =: / usr / bin (terkemuka kosong) PATH = / usr / bin: (trailing empty) dan PATH = / usr / bin :: / bin (kosong tengah) semuanya akan secara efektif menyertakan direktori kerja saat ini.
Itu tidak akan pernah menemukannya dengan mencari PATH. Jika dir saat ini tidak ada dalam PATH, itu tidak akan menemukannya dengan pencarian PATH.
Yang mengatakan (dan maaf menambah kebingungan) jika ada alias atau fungsi yang menjalankan perintah, itu akan dijalankan. Atau jika shell Anda memiliki cache lokasi, dan file yang dapat dieksekusi ada di dalam cache, ia mungkin menemukannya. Jadi, ia tidak akan pernah menemukannya di PATH, tetapi dapat dijalankan dengan cara lain.
sumber
cache
catatannya, hampir membuat saya gila bahwa executable lama/usr/bin/
masih belum digunakan/usr/local/bin
, tetapi ada di sebelah kiri$PATH
sampai saya log out, dan login lagi.Untuk melihat apa jalur Anda saat ini cukup ketik
echo $PATH
, atauprintenv PATH
.Maka Anda akan tahu urutan pencarian. Jika Anda memiliki banyak file dengan nama yang sama, jalankan ____ mana yang akan dilihat.
Ex.
cara keren untuk menemukan file yang berfungsi seperti target Anda adalah menggunakan apropos:
dan seterusnya...
sumber
whereis
menggunakan daftar lokasi hardcoded, bukan$PATH
.@ coneslayer- Urutan default untuk menemukan executable adalah path saat ini, perintah bawaan dan kemudian $ PATH. Jadi jika sebuah fungsi bernama executable sudah ada di pwd, maka itu dieksekusi.
sumber
./
), itu mencari direktori itu saja; jika tidak, ia mencari$PATH
.