Panggil perintah seperti ini:
mkdir -- -a
--
berarti opsi berakhir setelah itu, jadi -a
ditafsirkan secara harfiah dan bukan sebagai opsi untuk mkdir
. Anda akan menemukan sintaks ini tidak hanya di mkdir
, tetapi semua utilitas yang sesuai dengan POSIX kecuali untuk echo
dan test
. Dari spesifikasinya:
Argumen -- harus diterima sebagai pembatas yang menunjukkan akhir opsi. Argumen berikut harus diperlakukan sebagai operan, meskipun dimulai dengan karakter '-'. Argumen -- tidak boleh digunakan sebagai opsi atau sebagai operan.
Menggunakan --
sebagai pengaman direkomendasikan untuk hampir semua tindakan di mana Anda berurusan dengan nama file dan ingin memastikannya tidak merusak perintah, mis. saat memindahkan file dalam satu lingkaran, Anda mungkin ingin memanggil yang berikut, sehingga file bernama -i
tidak (dalam?) diuraikan dengan benar sebagai opsi:
mv -- "$f" new-"$f"
Cara paling sederhana yang harus bekerja dengan program yang masuk akal adalah dengan menggunakan nama jalur relatif di depan -
, mis. mkdir ./-a
akan membuat direktori bernama -a
dalam direktori kerja saat ini.
Contoh paling umum menggunakan "trik" ini adalah ketika Anda ingin menghapus file yang dimulai dengan tanda hubung, maka Anda dapat melakukan rm ./-a
.
Alasan mengapa mkdir '-a'
, atau mkdir \-a
tidak berfungsi karena kedua metode ini (menggunakan tanda kutip atau garis miring terbalik) digunakan untuk mencegah shell Anda (kemungkinan bash
) dari memberi mereka arti khusus. Sejak -a
tidak berarti sesuatu yang istimewa untuk shell, ini tidak berpengaruh pada bagaimana itu diteruskan ke mkdir
.
Sejauh mkdir
bersangkutan, ia menerima daftar argumen dari shell, dan ia tidak tahu apakah Anda memberi tanda kutip atau tidak, atau apakah ada garis miring terbalik. Itu hanya melihat satu argumen -a
. Itu sebabnya Anda membutuhkan --
seperti yang dijelaskan dalam jawaban lain.