Saya menulis naskah kecil hari ini yang berisi
grep -q ^local0 /etc/syslog.conf
Selama peninjauan, seorang rekan kerja menyarankan agar ^local0
dikutip karena ^
berarti "pipa" di kulit Bourne. Terkejut dengan klaim ini, saya mencoba melacak referensi yang menyebutkan hal ini. Tidak ada yang saya temukan di internet menyarankan ini adalah masalah.
Namun, ternyata implementasi bsh
(yang mengklaim sebagai Bourne shell) pada AIX 7 sebenarnya memiliki perilaku ini:
> bsh
$ ls ^ wc
23 23 183
$ ls | wc
23 23 183
Tidak satu pun dari implementasi "cangkang Bourne" lainnya yang saya coba lakukan dengan cara ini (yaitu, ^
tidak dianggap sebagai metacharacter shell sama sekali). Saya mencoba sh
CentOS (yang benar-benar bash), dan sh
pada FreeBSD (yang bukan bash). Saya tidak punya banyak sistem lain untuk dicoba.
Apakah perilaku ini diharapkan? Kerang mana yang dianggap ^
sebagai metacharacter pipa?
sumber
^
adalah karakter negasi di zsh dan juga di ruang regex. Sebagai komentar terpisah, umumnya disarankan untuk menggunakan tanda kutip tunggal dalam ekspresi grep untuk portabilitas di seluruh shell.[ x"$foo" = x"bar" ]
.bsh
itu bukan Shell Bourne. Nama ini disalahgunakan untuk Bourne Shell di AIX saja.bsh
lebih merupakan shell yang diperkenalkan oleh saya pada tahun 1984 di H.Berhold AG pada UNOS (klon UNIX pertama). Perhatikan bahwa AIX tidak ada pada tahun 1984.Jawaban:
The
^
karakter sebagai sinonim dari|
tanggal kembali dari shell Thompson . Mereka diperkenalkan pada saat yang sama di Unix v4 dan disebutkan bersama di halaman manual . Sven Mascheck menyebutkan bahwa^
"mungkin [diperkenalkan] untuk alasan kenyamanan pada terminal kasus-atas awal saja" di mana mengetik|
adalah "agak menyusahkan" .Cangkang Thompson sudah lama hilang, tetapi penggantinya cangkang Bourne mempertahankan sintaksis yang sama (meskipun halaman manualnya hanya menyebutkan
|
).Shell penerus seperti abu, bash dan ksh hanya dipahami
|
sebagai karakter pipa. Anda tidak akan menemukan shell Bourne aktual pada varian unix open source karena untuk waktu yang lama tidak ada rilis open source shell Bourne. (Saya pikir OpenSolaris termasuk satu, tetapi tidak diadopsi di tempat lain karena pada saat itu sudah lama ditinggalkan oleh implementasi yang lebih baru).Spesifikasi Single Unix tidak menyebutkan
^
sebagai karakter khusus, yang secara efektif berarti bahwa shell POSIX harus menafsirkannya secara harfiah¹. Saya tidak berpikir pernah ada varian yang sepenuhnya kompatibel dengan POSIX dari shell Bourne (hanya implementasi independen).^
khusus di zsh ketika opsiextendedglob
diaktifkan, tetapi tidak dalam mode kompatibilitas sh. Dalam mode standarnya, ia menyimpang dari POSIX dalam banyak cara.Saya sarankan mengutip
^
dalam ungkapan reguler untuk kejelasan. Mengutip ekspresi reguler dalam skrip terlepas dari karakter apa yang muncul di dalamnya.¹ Kecuali sebagai karakter pertama dari ekspresi bracket dalam pola wildcard, di mana
!
karakter negasi standar tetapi implementasinya juga dapat menginterpretasikan^
dengan cara yang sama.sumber
^
itu khusus difish
mana itu adalah operator pengalihan,rc
/ dies
mana itu adalah operator gabungan , atau csh / tcsh / bash / zsh untuk ekspansi riwayat ketika itu adalah karakter pertama dari baris perintah.Ternyata itu
^
tampaknya merupakan fitur tidak berdokumen dari shell SVR 4.2. Dari GNU Bash, Appendix B Perbedaan Utama dari The Bourne Shell :sumber
Ya, OpenSolaris termasuk sumber Bourne Shell tetapi sumber itu tidak portabel.
Versi sumber Bourne Shell yang terawat dan sangat portabel dapat ditemukan di sini di
schily-*.tar.bz2
arsip.Berikut adalah bagian terkait dari sumber di
cmd.c
:Anda lihat, ini tidak terkait dengan shell tertentu (misalnya shell Thompson) tetapi dengan fakta bahwa pada tahun 1970-an masih ada terminal huruf besar hanya sekitar.
sumber