Penggunaan ^ sebagai metacharacter shell


19

Saya menulis naskah kecil hari ini yang berisi

grep -q ^local0 /etc/syslog.conf

Selama peninjauan, seorang rekan kerja menyarankan agar ^local0dikutip 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 shCentOS (yang benar-benar bash), dan shpada FreeBSD (yang bukan bash). Saya tidak punya banyak sistem lain untuk dicoba.

Apakah perilaku ini diharapkan? Kerang mana yang dianggap ^sebagai metacharacter pipa?


1
Saya tahu itu ^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.
mkc

Shell bourne memiliki banyak perilaku aneh yang kita masih melihat pekerjaan di sekitar untuk kode shell modern misalnya [ x"$foo" = x"bar" ].
jordanm

bshitu bukan Shell Bourne. Nama ini disalahgunakan untuk Bourne Shell di AIX saja. bshlebih 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.
schily

Jawaban:


21

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 opsi extendedglobdiaktifkan, 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.


Terima kasih, seluruh utas TUHS dari tahun 2003 mencerahkan.
Greg Hewgill

Untuk kelengkapan, Anda mungkin ingin menyebutkan bahwa ^itu khusus di fishmana itu adalah operator pengalihan, rc/ di esmana itu adalah operator gabungan , atau csh / tcsh / bash / zsh untuk ekspansi riwayat ketika itu adalah karakter pertama dari baris perintah.
Stéphane Chazelas


3

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.bz2arsip.

Berikut adalah bagian terkait dari sumber di cmd.c:

/* 
* ^ is a relic from the days of UPPER CASE ONLY tty model 33s 
*/ 
if ((t = item(TRUE)) != 0 && (wdval == '^' || wdval == '|')) 

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.