Seperti judulnya, apakah ada perbedaan untuk * NIX filesystems? misalnya ls file
danls ./file
Seperti judulnya, apakah ada perbedaan untuk * NIX filesystems? misalnya ls file
danls ./file
Jawaban:
Saya tidak tergila-gila dengan penjelasan oleh SmallLoanOf1M. Secara teknis itu benar tetapi menjawab dengan cara yang tidak cocok dengan contoh penggunaan dalam pertanyaan.
Jadi sebagai contoh, berikut adalah satu perbedaan penting antara keduanya dari pertanyaan: "file" dan "./file"
Bagaimana jika file tersebut dinamai dengan karakter yang diuraikan oleh shell? Terutama mengenai karakter yang ditafsirkan oleh perintah yang sedang dijalankan.
Secara khusus, karakter "dash": "-". Tapi karakter lain bermakna bagi shell.
Contoh. File saya bernama "-dingle"
Coba daftar file:
ls -dingle
# ls -dingle
ls: invalid option -- 'e'
Lebih buruk lagi, bagaimana jika file itu bernama " -rf rmbomb *
"? Sekarang coba hapus
rm "-rf rmbomb *"
Saya bahkan tidak akan mencoba menjalankan contoh itu, tetapi mudah-mudahan Anda mendapatkan idenya.
Jadi, bagaimana Anda mendaftar file menatap dengan tanda hubung? Gunakan ./
di depan.
# ls ./-dingle
./-dingle
Ditto untuk rm
ls \-dingle
atau ls \-rf\ rmbomb\ \*
. Ini bisa menjadi cara yang baik untuk memastikan bahwa serangkaian perintah yang diberikan setidaknya konsisten, karena menentukan ./
sebelum nama tidak akan keluar dari karakter setelah ./
.
rm "-rf rmbomb *"
benar-benar akan melakukan sesuatu yang buruk, bukan hanya membuat rm
kesalahan cetak. Hanya berbahaya jika Anda lupa mengutip nama file, sehingga terjadi pemisahan kata. (esp. dalam shell script di mana Anda menjalankan rm $file
bukannya rm "$file"
. Tapi dalam hal ini, *
tidak akan berkembang, karena ekspansi gumpal tidak terjadi pada isi ekspansi variabel. Jika Anda ingin itu, Anda akan membutuhkan eval
.) Lagi pula, jika skrip Anda memisahkan nama file sebelum meneruskan ke rm, saya akan membuat file bernama space -rf .
atau sesuatu, jadi rm ./$i
tidak membantu.
rm: invalid option -- ' '
, dari ketika mencoba menafsirkan ruang setelah -rf
sebagai saklar satu karakter, karena itu bagian dari argumen yang sama. (Dan ya, saya menjalankan ini di dalam direktori kosong kalau-kalau saya telah mengabaikan sesuatu dan itu sebenarnya berbahaya: P)
IFS=''
dan -f
masing - masing. Contoh yang lebih jarang adalah yang awk
memperlakukan operan (selain operan pertama yang merupakan skrip) yang memiliki bentuk foo=bar
sebagai tugas untuk dieksekusi tetapi ./foo=bar
sebagai file untuk dibaca.
Iya.
Dengan mengeluarkan file
pada baris perintah, BASH akan mencari variabel lingkungan $ PATH Anda untuk file dari nama itu. Kecuali file berada di direktori dalam variabel $ PATH Anda, itu tidak akan ditemukan.
.
berarti direktori saat ini. ./
berarti dalam direktori saat ini, secara relatif. Ini sama dengan mengatakan sesuatu seperti /home/sheogorath/shivering/isles.img
ketika memohon ./isles.img
saat bekerja di /home/sheogorath/shivering/
direktori.
Dengan demikian, ini biasanya digunakan untuk mengeksekusi file dalam direktori kerja Anda "di tempat".
EDIT:
Dalam contoh Anda, ls
dipanggil oleh shell dan ditemukan dengan menggunakan variabel path. Argumennya akan diproses di direktori kerja Anda, apa pun itu. Karena ini adalah default untuk ls
, Anda tidak akan melihat perbedaan antara menentukan file
dan menentukan secara eksplisit ./file
karena keduanya menunjuk ke direktori Anda saat ini.
Tidak semua perintah akan menerima jalur file di direktori kerja, dan beberapa berharap Anda menyatakan file dalam direktori yang mereka tentukan sebelumnya melalui konfigurasi. Di antara perintah yang menerima file sebagai argumen, perintah ini kurang umum
ls
disebutkan dalam pertanyaan asli. Itu lebih perbedaan antara mereferensikan jalur relatif (relatif terhadap direktori kerja saat ini) Yaitu ../../dir/filename
dan jalur absolut /path/to/dir/filename
ls
mereka akan selalu menjadi jalan yang sama, yang ditentukan lebih eksplisit daripada yang lain. Tidak semua perintah berperilaku seperti ini saat memproses argumen, tetapi sebagian besar melakukannya.