bash
awalnya dirancang pada akhir 80-an sebagai tiruan sebagian ksh
dengan beberapa fitur interaktif dari csh / tcsh.
Asal usul globbing harus ditemukan dalam cangkang-cangkang sebelumnya yang menjadi dasarnya.
ksh
sendiri merupakan perpanjangan dari shell Bourne. Shell Bourne itu sendiri (pertama kali dirilis pada tahun 1979 di Unix V7) adalah implementasi bersih dari awal, tetapi tidak sepenuhnya berangkat dari shell Thompson (shell V1 -> V6) dan memasukkan fitur dari shell Mashey.
Secara khusus, argumen perintah masih dipisahkan oleh kosong, |
sekarang operator pipa baru tetapi ^
masih didukung sebagai alternatif (dan juga menjelaskan mengapa Anda melakukannya [!a-z]
dan tidak [^a-z]
), $1
masih argumen pertama untuk skrip dan backslash masih karakter pelarian . Begitu banyak operator regexp ( ^\|$
) memiliki makna tersendiri di shell.
Shell Thompson mengandalkan utilitas eksternal untuk globbing. Ketika sh
ditemukan tanda kutip *
, [
atau ?
s dalam perintah, itu akan menjalankan perintah glob
.
rm *.txt
akan berakhir menjalankan glob sebagai:
["glob", "rm", "*.txt"]
dan glob akan berakhir berjalan rm
dengan daftar file yang cocok dengan pola itu.
grep a.\*b *.txt
akan berjalan glob
sebagai:
["glob", "grep", "a.\252b", "*.txt"]
Di *
atas telah dikutip dengan menetapkan bit ke-8 pada karakter itu, mencegah glob
memperlakukannya sebagai wildcard. glob
kemudian akan menghapus bit itu sebelum memanggil grep
.
Untuk melakukan hal yang sama dengan regexps, itu seharusnya:
regexp rm '\.txt$'
Atau:
regexp rm '^[^.].*\.txt$'
untuk mengecualikan file-file dot.
Kebutuhan untuk melarikan diri dari operator karena mereka menggandakan sebagai karakter khusus shell, fakta bahwa .
, umum dalam nama file adalah operator regexp membuatnya sangat tidak sesuai untuk mencocokkan nama file dan rumit untuk pemula. Dalam kebanyakan kasus, semua yang Anda butuhkan adalah wildcard yang dapat menggantikan satu ( ?
) atau nomor ( *
) karakter apa pun.
Sekarang, cangkang yang berbeda menambahkan operator globbing yang berbeda. Saat ini, ksh dan zsh gumpalan (dan sampai batas tertentu bash -O extglob
yang mengimplementasikan himpunan bagian dari gumpalan ksh) secara fungsional setara dengan regexps dengan sintaks yang kurang rumit untuk digunakan dengan nama file dan sintaksis shell saat ini. Misalnya, dalam zsh
(dengan ekstensi extendedglob), Anda dapat melakukan:
echo a#.txt
jika Anda ingin (tidak mungkin) mencocokkan nama file yang terdiri dari urutan a
diikuti oleh .txt
. Lebih mudah daripada echo (^a*\.txt$)
(di sini menggunakan kawat gigi sebagai cara untuk mengisolasi operator regex dari operator shell yang bisa menjadi salah satu cara shell bisa mengatasinya).
echo (foo|bar|<1-20>).(#i)mpg
Untuk file mpg (tidak sensitif huruf besar) yang nama dasarnya adalah foo, bar atau angka desimal dari 1 hingga 20 ...
ksh93
sekarang juga dapat memasukkan regexps (dasar, diperpanjang, perl-like atau "augmented") dalam gumpalannya (meskipun cukup buggy) dan bahkan menyediakan alat untuk mengkonversi antara glob dan regexp ( printf %R
, printf %P
):
echo ~(Ei:.*\.txt)
untuk mencocokkan file-file txt (non-tersembunyi) dengan E- xtended regular expressions, case- i nsensitive.
rm -- ^[^.].*\.txt$
bukanrm -- *.txt
?