Mengapa saya harus mengetik "./" selalu sebelum dieksekusi untuk menjalankannya di Linux?

8

Ketika saya mengkompilasi egxc dengan:

GCC x.c -o x

Untuk menjalankan hasil, saya harus menulis:

./x

Dan cukup mengetik:

x

Gagal dengan pesan ini:

x: perintah tidak ditemukan

Ini berarti Linux tidak mencari direktori saat ini untuk itu! Apakah ada (saya yakin ada) masalah yang masuk akal di balik perilaku ini?

Yasser Zamani
sumber
Karena itu aturannya.
Daniel R Hicks
@DanH: Tolong jelaskan "aturan".
Torben Gundtofte-Bruun

Jawaban:

13

Karena secara default, direktori kerja saat ini tidak dalam PATHvariabel.

Ini adalah langkah keamanan / kenyamanan. Jika Anda memiliki binari / skrip bernama eg cd,, lsdll di direktori kerja Anda saat ini, akan sangat menjengkelkan jika dijalankan secara default.

Oliver Charlesworth
sumber
4
Jawabannya hanya sebagian yang benar. Masalahnya bisa diatasi jika direktori saat ini hanya digunakan sebagai opsi terakhir. Maka alat standar masih akan ditemukan terlebih dahulu.
pengguna tidak diketahui
1
Juga, builtin shell mengambil precendence (yaitu ketika Anda mengetik cddi bash, dijalankan internal rutin untuk bash dan tidak /bin/cd) kecuali Anda tambahkan dengan `.`
LawrenceC
3
Salah satu langkah-langkah keamanan * nix asli, itu memaksa sistem atau admin mengkompilasi binari yang ada di perintah jalur yang ditugaskan sistem untuk dieksekusi. Tidak ada yang seburuk seseorang untuk login sebagai root pada pertanyaan help desk, pergi ke direktori pengguna, ketik ls dan menemukan mereka memuat bom yang ditinggalkan oleh pengguna.
Fiasco Labs
7
@userunknown: Dan pertama kali Anda salah ketik sl, Anda punya masalah yang sama. Hanya direktori tepercaya yang harus ada $PATHdan jalur relatif seperti .tidak pernah merupakan direktori tepercaya untuk shell interaktif.
2
@ Dasar: Jika saya mengetik rm -r targetketika saya maksudkan rm -f targetbiasanya tidak ada perbedaan. Jika saya mengetik rm -f targetketika saya maksudkan rm -r target, tidak ada perbedaan atau penghapusan gagal total. Selain itu, saya pikir setiap kali sebelum saya mengetik rm, terutama jika saya menambahkan -fatau -ratau bola - itu adalah perintah yang berbahaya berdasarkan sifatnya. Tidak ada yang berpikir sebelum ls.
1

Ini berarti bahwa direktori saat ini tidak dalam variabel $ PATH.

James
sumber
1

Anda dapat memperbaikinya dengan menambahkan direktori saat ini (diwakili oleh satu titik) ke PATHvariabel lingkungan.
Cara melakukannya tergantung pada shell yang Anda gunakan.
jika Anda menggunakan bash, Anda dapat menambahkan baris export PATH=$PATH:.ke .bashrcfile di direktori home Anda.
jika Anda menggunakan csh atau tcsh tambahkan baris set PATH = ($PATH .)ke file .cshrc di direktori home Anda.
IMHO, untuk komputer desktop rumah ini adalah hal yang dapat diterima untuk dilakukan - keamanan bijaksana.

kroiz
sumber
Saya tidak tahu kita bisa menambahkan. untuk PATH, bagaimanapun, melakukan ini akan mengurangi keamanan, bukan?
Yasser Zamani