Apakah globbing merupakan fitur dari shell?

12

Saya membaca banyak pertanyaan dan jawaban seperti ini dan ini

Saya tahu wildcard diperluas oleh shell sebelum menjalankan perintah dan mereka adalah fitur shell. Juga wildcard berfungsi dengan perintah-perintah yang dapat menerima banyak argumen. Dalam find . -name *.rb jika kita memiliki lebih dari satu file dalam direktori saat ini findakan memberi kita error karena menemukan tidak dapat menerima beberapa argumen dan cara untuk mengatasi ini adalah:

find . -name "*.rb"
find . -name '*.rb'
find . -name \*.rb

Kami lolos dari tanda bintang dan mencegah ekspansi oleh shell tetapi wildcard adalah fitur dari shell; ketika kita keluar dari shell asterisk tidak tahu artinya, dan itu harus menemukan file bernama *.rb, jadi bagaimana asterisk diperluas dalam kasus ini?

Sinoosh
sumber

Jawaban:

21

Ya, shell mengerti *karena semua file dengan karakter apa pun di direktori dan *.rbsemua file dengan karakter apa pun dan berakhir .rb, dan memperluasnya seperti itu.

The findperintah itu sendiri menerima globbing.

Jika Anda tidak mengutip *maka shell akan memperluas sebelum itu findperintah melihat argumen, jadi bukan segumpal *.rbditeruskan ke find, nama semua file yang cocok dengan gumpal di direktori akan diteruskan ke find, dan findakan mencoba untuk menafsirkannya sebagai argumen, yang kemungkinan akan menghasilkan kesalahan, atau setidaknya bukan yang Anda inginkan (ini akan berfungsi dengan benar hanya jika tidak ada file yang cocok di direktori saat ini)

Zanna
sumber
terima kasih, itu berarti kami mengatakan untuk shell itu bukan glob tetapi beberapa perintah dapat memperluas wildcard? atau bisakah kita mengatakan jika kita memiliki shell tanpa memahami tentang globbing perintah-perintah yang tahu tentang globbing dapat mengembangkannya?
Sinoosh
5
jika *dikutip, maka shell tidak akan memperluasnya, dan argumen termasuk glob dilewatkan ke perintah yang dapat memahami glob - itu sama untuk setiap perintah yang menerima regex yang harus selalu dikutip ...
Zanna
1
Kesenangan saya ^ _ ^
Zanna
7
@Sinoosh: Perhatikan bahwa tidak semua perintah mengerti sintaks glob. Kebetulan itu adalah fiturfind
slebetman
1
@Sinoosh Find tidak benar-benar "memperluas" wildcard, melainkan menggunakannya sebagai tes untuk mencocokkan setiap nama file yang ditemuinya. Ada (sangat) sedikit perintah yang memperluas wildcard dalam arti konvensional - unzip dan 7z dapat menggunakannya untuk membuka banyak arsip (ketika argumen mereka biasanya berupa " [archive filename single argument] [list of files to extract]") misalnya.
Random832