Ini adalah output dari ls -all
perintah:
-rwxr----- 1 subhrcho dba 3600 Nov 13 17:26 jdev
-rw-r----- 1 subhrcho dba 1566 Nov 13 17:26 jdev-Darwin.conf
-rw-r----- 1 subhrcho dba 347 Mar 6 2009 jdev-debug.boot
-rw-r----- 1 subhrcho dba 821 Nov 13 17:26 jdev-logging-debug.conf
-rw-r----- 1 subhrcho dba 584 Nov 13 17:26 jdev-logging.conf
-rw-r----- 1 subhrcho dba 4717 Jul 31 16:09 jdev.boot
-rw-r----- 1 subhrcho dba 12877 Nov 13 17:26 jdev.common
-rw-r----- 1 subhrcho dba 5047 Dec 6 01:43 jdev.conf
-rwxr-x--- 1 subhrcho dba 28160 Nov 13 16:28 jdev.exe
-rwxr-x--- 1 subhrcho dba 28672 Nov 13 16:28 jdev64.exe
-rwxr-x--- 1 subhrcho dba 28672 Nov 13 16:28 jdev64W.exe
-rwxr-x--- 1 subhrcho dba 28160 Nov 13 16:28 jdevW.exe
Sekarang ketika saya menjalankannya jdev
menjalankan versi yang berbeda dari Oracle JDveloper daripada ketika saya menjalankannya sebagai ... ./jdev
Mengapa demikian?
which
utilitas dapat memberi tahu Anda apa yang dapat dieksekusi akan digunakan jika tidak ada jalur yang diberikan.type
untuk memeriksa apa yang diluncurkan oleh perintah tertentu. Sebabwhich
akan menunjukkan kepada Anda hanya sebuah biner di suatu tempat di $ PATH, namun itu mungkin sama sekali menjadi biner lain.[~] $which zsoelim /usr/bin/zsoelim [~] $ type zsoelim zsoelim is /usr/bin/zsoelim
. Sementarazsoelim -> soelim
which
tidak memiliki kesempatan untuk menemukan, karena itu adalah biner mandiri yang tidak memiliki akses ke lingkungan shell yang berjalan (yang saya maksudkan alias dan fungsi, bukan hanya variabel lingkungan , beberapa di antaranya adalah warisan).Jika Anda memanggil perintah tanpa slash dalam namanya di shell, maka dicari di alias shell, fungsi dan dalam daftar jalur yang disediakan dalam
$PATH
variabel lingkungan. (perhatikan bahwa Anda dapat memiliki direktori kerja saat ini (ditentukan sebagai.
atau string kosong) atau direktori relatif apa pun di$PATH
, tetapi itu tidak disarankan untuk alasan keamanan).Jika ada garis miring pada nama, maka itu tidak terjadi, nama tersebut diambil sebagai jalur untuk menjalankan perintah dari (meskipun beberapa shell seperti
zsh
memungkinkan alias atau fungsi memiliki garis miring pada namanya yang kemudian akan diutamakan).Jadi, jika Anda ingin menjalankan perintah bernama
foo
yang ada di direktori kerja saat ini, Anda harus datang dengan nama yang berisi garis miring../foo
adalah yang paling jelas. Anda juga bisa menggunakan path lengkap, atau../dir/foo
...Untuk mengetahui apa yang akan dijalankan shell, gunakan
type
perintah. Jangan gunakanwhich
perintah yang umumnya tidak melakukan apa yang Anda pikirkan dan merupakan warisancsh
yang lebih baik dibiarkan begitu saja.sumber
which
. Lihat misalnya unix.stackexchange.com/questions/16693/…Saya merekomendasikan untuk menggunakan built-in Zsh 'di mana' (lebih baik daripada 'yang') untuk melihat bagaimana dan di mana urutan alias, built-in shell atau apa pun akan ditemukan untuk $ PATH ;-)
Berikut adalah contoh untuk memahami sesuatu dengan lebih baik, bagaimana hal itu dipilih:
sumber
Meskipun ini mungkin tergantung pada shell Anda, aturannya biasanya adalah:
Jika Anda memberikan jalur, baik relatif atau absolut, jalur itu digunakan.
./jdev
adalah jalur relatif, karena.
singkatan dari direktori saat ini (pada kenyataannya,ls -all .
akan memberi Anda sama denganls -all
). Jika ya/usr/bin/tool/
, Anda menggunakan jalur absolut. Dalam kasus ini, file yang ditunjuk untuk dieksekusi.Jika Anda tidak memberikan jalur, tetapi hanya nama, direktori di
$PATH
akan mencari alat yang Anda coba jalankan.Jika Anda memiliki file di direktori saat ini dengan nama yang sama dengan file di beberapa direktori di
$PATH
, dan Anda menjalankannya dengan menambahkan./
namanya terlebih dahulu, Anda akan secara efektif menjalankan file yang berbeda.Mungkin masalah lain adalah bahwa Anda benar-benar mengharapkan
jdev
untuk menjalankan executable di direktori saat ini. Kecuali Anda berubah$PATH
untuk memasukkan.
, ini bukan sesuatu yang harus Anda harapkan sama sekali ...... dan itu masih merupakan ide yang tidak terlalu baik untuk dimasukkan di
.
sana, jika Anda melakukannya harap paling tidak taruh di bagian akhir, sehingga sisanya$PATH
selalu dicari terlebih dahulu - bayangkan Anda berada di direktori jaringan bersama dan seseorang memutuskan untuk meletakkan biner jahat di sana karenals
, jika$PATH
dimulai dengan.
, sederhanals -lah
akan cukup untuk menyerang sistem Anda.sumber
jdev
sendiri juga merupakan jalur relatif. Aturannya adalah: jika tidak mengandung garis miring, maka itu akan dicari dalam alias, fungsi dan$PATH
, jika tidak, akan dicari secara langsung pada sistem file (meskipun beberapa shell memungkinkan alias atau fungsi dengan / dalam nama mereka yang kemudian akan mengambil prioritas).