Mengapa kita menggunakan "./" untuk mengeksekusi file?

84

Mengapa kita menggunakan ./filenameuntuk mengeksekusi file di linux?

Mengapa tidak memasukkan saja seperti perintah lain gcc, lsdll ...

Renjith G
sumber
Bukankah baris pertama lebih baik ditulis sebagai "Mengapa kita menggunakan ./command_nameuntuk mengeksekusi perintah di linux?"

Jawaban:

78

Di Linux, UNIX dan sistem operasi terkait, .menunjukkan direktori saat ini. Karena Anda ingin menjalankan file di direktori Anda saat ini dan direktori itu tidak ada di Anda $PATH, Anda perlu ./bit untuk memberi tahu shell di mana executable berada. Jadi, ./fooberarti menjalankan executable yang disebut fooyang ada di direktori ini.

Anda dapat menggunakan typeatau whichuntuk mendapatkan path lengkap dari semua perintah yang ditemukan di $PATH.

badp
sumber
5
Sangat umum untuk menjalankan program di direktori saat ini. Mengapa shell tidak mencari di sana juga? Pertama mencari di., Lalu di $ PATH.
Michael
ada juga aliases yang bisa menghalangi, bukan hanya $PATH.
user2485710
18
@Michael keamanan dan kewarasan: Jika dicari .terlebih dahulu maka itu akan menjadi masalah keamanan, Anda atau orang lain dapat menggantikan lsmisalnya (virus / trojen sederhana: membuat file zip dengan executable bernama lsdi dalamnya, ketika seseorang mencari melalui , mereka menjalankan executable ini, itu ...). Jika itu dicari .terakhir maka Anda bisa menghabiskan waktu lama menjadi gila tidak tahu mengapa program Anda tidak bekerja (misalnya Anda membuat program yang disebut tes, alih-alih menjalankan program Anda, ia menjalankan program pengujian sistem. Yang tidak menghasilkan output).
ctrl-alt-delor
Ini juga memastikan bahwa jika aplikasi atau skrip muncul beberapa kali di jalur Anda, bahwa Anda menjalankan versi yang ingin Anda jalankan (yang ada di sini di direktori ".").
Jim2B
Anda dapat menjalankan export PATH="$PATH:."untuk mengeksekusi perintah dalam direktori saat ini jika tidak ditemukan di tempat lain di PATH, Anda dapat menambahkan ini dalam file .bashrc Anda
jcubic
99

Jawaban literalnya adalah seperti yang diberikan orang lain: karena direktori saat ini tidak ada di Anda $PATH.

Tapi mengapa? Singkatnya, ini untuk keamanan. Jika Anda mencari di direktori home orang lain (atau / tmp), dan ketikkan saja gccatau ls, Anda ingin tahu Anda menjalankan yang asli, bukan versi jahat yang ditulis teman iseng Anda yang menghapus semua file Anda. Contoh lain adalah testatau [, yang mungkin mengesampingkan perintah-perintah itu di skrip shell, jika shell Anda tidak memiliki itu sebagai built-in.

Memiliki .sebagai entri terakhir di jalur Anda sedikit lebih aman, tetapi ada serangan lain yang memanfaatkannya. Yang mudah adalah dengan mengeksploitasi kesalahan ketik umum, seperti slatau ls-l. Atau, temukan perintah umum yang kebetulan tidak diinstal pada sistem ini - vim, misalnya, karena sysadmin berkemungkinan di atas rata-rata untuk mengetikkannya.

mattdm
sumber
5
Contoh praktis seseorang mendapatkan sedikit dengan ini: unix.stackexchange.com/questions/7767
mattdm
Hanya memiliki jalur absolut dalam PATHvariabel lingkungan.
Ed Heal
45

Jika maksud Anda, mengapa Anda perlu ./ pada awalnya - itu karena (tidak seperti di Windows), direktori saat ini bukan bagian dari jalur Anda secara default. Jika Anda menjalankan:

$ ls

shell Anda mencari lsdi direktori dalam variabel lingkungan PATH Anda ( echo $PATHuntuk melihatnya), dan menjalankan executable pertama yang disebutnya ls. Jika Anda mengetik:

$ a.out

shell akan melakukan hal yang sama - tetapi mungkin tidak akan menemukan executable yang disebut a.out. Anda perlu memberi tahu shell di mana a.out berada - itu ada di direktori saat ini (.) Maka pathnya adalah ./a.out.

Jika Anda bertanya mengapa ini disebut "a.out", itu hanya nama file output default untuk gcc. Anda dapat mengubahnya dengan arg baris perintah -o. Sebagai contoh:

$ gcc test.c -o test
$ ./test
Simon Whitaker
sumber
Terima kasih. Keraguan saya adalah mengapa Anda membutuhkan ./ pada awalnya .... Saya dapat menggunakan "." (untuk menulis direktori saat ini) tetapi mengapa "/" setelah itu?
Renjith G
8
/ adalah pemisah path di Linux, jadi Anda menggunakannya untuk memisahkan direktori (.) dari nama file (a.out). Tanpanya Anda memiliki .a.out yang merupakan nama file yang valid dengan sendirinya. (Coba touch .a.out; ls -lAlihat ini.)
Simon Whitaker
5
itu adalah bagaimana Anda menentukan path di Unix, <dir>/<file>jadi Anda pada dasarnya mengatakan mengeksekusi file dalam direktori saat ini, yang ditunjukkan oleh./test
Rohan Monga
Red Hat Linux merilis 9 (Shrike) Kernel 2.4.20-8 pada i686 [renjithg @ cvsserver renjithg] $ touch .a.out; ls -lA total 3 -rw-rw-r-- 1 renjithg renjithg 0 Nov 30 13 : 46 .a.out -rwxrwxr-x 1 renjithg renjithg 11669 30 Nov 13:46 a.out -rw-rw-r-- 1 renjithg renjithg 218 Agustus 24 2009 aray.c [renjithg @ cvsserver renjithg] $
Renjith G
3
Red Hat Linux 9? Saatnya untuk meningkatkan!
mattdm
4

Anda dapat mencoba menambahkan :.ke variabel $ PATH Anda.

Coba ALT + F2 dan ketik: gksudo gedit /etc/environmentif menjalankan Linux / GTK (ini adalah apa yang Anda miliki jika menggunakan Ubuntu).

NAMUN, saya sangat menyarankan Anda untuk tidak melakukannya. Ini buruk, buruk, buruk.

Anda tahu, hal-hal semacam itu berfungsi seperti ini sejak tahun 1970. Ada alasan mengapa direktori saat ini tidak termasuk dalam $ PATH.

. adalah direktori saat ini

.somethingakan menjadi file tersembunyi (Ketik "ALT +" untuk membuatnya muncul di Nautilus, atau coba " ls -la".

./someProgram.sh adalah apa yang Anda ketik untuk MENJALANKAN someProgram.sh yang dapat dieksekusi di direktori saat ini.

.somethingElse berarti Anda memiliki executable tersembunyi di direktori saat ini, yang merupakan ide yang buruk.

tiktak
sumber