Itu awalnya mengejutkan perilaku wildcard, karena deskripsi untuk *
karakter wildcard mengatakan:
Cocok dengan sembarang string, termasuk string nol.
... sampai Anda menyadari bahwa periode itu sedikit istimewa ketika itu adalah karakter pertama dari sebuah nama file. Teks pengantar di 3.5.8 Filename Expansion
mengatakannya:
Saat pola digunakan untuk ekspansi nama file, karakter '.' di awal nama file atau segera setelah slash harus dicocokkan secara eksplisit, kecuali opsi shell dotglob diatur.
"Pola penggunaan" dari awalan wildcard dengan ./
berguna untuk Menangani nama dengan dasbor terdepan dalam bash shell , seperti komentar steeldriver. Ini tidak berpengaruh pada ekspansi wildcard / nama file, tetapi membuatnya lebih aman / lebih mudah untuk menangani nama file ketika Anda merujuknya, jika mereka mulai dengan karakter yang mungkin disalahartikan oleh program-program tersebut sebagai opsi. Sebagai contoh:
# I want a file named `-n`
$ touch -n
touch: invalid option -- 'n'
Try 'touch --help' for more information.
$ touch -- -n
### ok
$ touch ./-n
### ok
... dan sekarang saya memiliki file yang bernama -n
, jika kebetulan saya memutarnya dengan wildcard:
for file in *n
do
echo "$file"
done
... Saya tidak mendapatkan hasil!
Tetapi jika saya awali wildcard dengan ./
,
for file in ./*n
do
echo "$file"
done
./-n
... Saya melihat nama file.
Ini adalah contoh sederhana untuk tujuan demonstrasi; lihat juga Mengapa printf lebih baik daripada gema? untuk alasan ini dan lainnya. Utilitas lain akan tersandung oleh opsi lain, jadi lebih baik menghadirkan nama file ke utilitas seaman mungkin. Jika Anda tidak awalan wildcard untuk "melarikan diri" nama file, Anda harus "melindungi" utilitas Anda dengan cara lain; satu yang umum adalah untuk menandai akhir dari opsi dengan --
, misalnya:
for file in *n
do
mv -- "$file" backup/"$file"
done
... yang akan meneruskan -n
nama file dengan aman mv
(seperti yang terlihat di bawah set -x
):
mv -- -n backup/-n
./*
adalah memastikan bahwa nama yang dimulai dengan-
tidak diperlakukan sebagai opsi.