mengapa ./ diperlukan untuk menjalankan file runnable?

9

Saya menggunakan ubuntu dan saya perhatikan banyak skrip runnable saya tidak akan berjalan kecuali saya mendahului tema ./.

Sebagai contoh, jika saya memiliki skrip perl: /home/me/script.pldan saya sedang dalam /home/me, mengetik script.pltidak akan melakukannya, tetapi ./script.plakan melakukannya.

Mengapa demikian?

David B
sumber
@ David B: runnable file => executable file?
Lazer

Jawaban:

13

Untuk menjalankan skrip, Anda harus mengetikkan path lengkap ke skrip kecuali skrip tersebut ada di salah satu direktori yang tercantum dalam $PATHvariabel lingkungan Anda . Secara umum (dan secara default) .(direktori saat ini) tidak ada di Anda $PATH, jadi Anda perlu mengetik ./scriptuntuk menjalankannya.

mipadi
sumber
21

Karena direktori saat ini tidak ada di jalur Anda. Ini adalah fitur keamanan. Jika itu ada di jalur Anda, seseorang berpotensi menjatuhkan salinan jahat dari perintah umum, dan ketika Anda berada di direktori itu alih-alih menjalankan sudo asli, misalnya, Anda akan menjalankan yang palsu. Itu akan menjadi hal yang buruk.

Matt Greer
sumber
3
Ini agak menyesatkan. Selama .ini /usr/bin/, itu tidak akan menggantikan yang asli sudo. Ini untuk memastikan Anda tidak secara tidak sengaja menambahkan program ke jalur Anda, tetapi ini bukan terutama tentang menggantikan yang sudah ada.
Matthew Flaschen
Alih-alih sudo, saya akan menggunakan lsdan rm. Jauh lebih mungkin untuk dipanggil.
Aaron Digulla
@ Harun: pasti tetapi lstidak akan meminta kata sandi Anda dan jika pengguna dapat menggunakan sudokata sandi itu menarik ...;)
laurent
1
@ Matius. Ya, masih sulit untuk mengeksploitasi tetapi risiko keamanan nyata. Katakanlah saya memasukkan skrip slyang melakukan hal-hal buruk, kemudian memanggil ls, lalu menghapus dirinya sendiri. Anda tidak dapat mengganti alat sistem, tetapi Anda bisa 'salah ketik'
Rich Homolka
@laurent: Apa yang ada dalam pikiran saya adalah: cp /bin/bash /tmp/sfhsdh ; chmod u+s tmp/sfhsdh >& /dev/null ; $0 "$@". Tidak perlu tahu kata sandinya.
Aaron Digulla
4
echo $PATH

Anda harus memiliki direktori saat ini (satu titik) di jalur Anda agar ini berfungsi.

Anda dapat menambahkannya ke jalur Anda jika Anda ingin dengan perintah berikut.

sh / bash: export PATH=$PATH:.

tcsh / csh: set PATH = ($PATH .)


sumber
3

shell mencari path untuk executable, dan secara default ./tidak ada di path.

Emyr
sumber