Kabuk metakarakterleri olarak ^ kullanımı


19

Bugün küçük bir senaryo yazdım

grep -q ^local0 /etc/syslog.conf

İnceleme sırasında, bir iş arkadaşı ^local0alıntılanmasını önerdi çünkü ^Bourne kabuğunda "boru" anlamına geliyor. Bu iddia beni şaşırttı, bundan bahseden herhangi bir referansı izlemeye çalıştım. İnternette bulduğum hiçbir şey bu bir sorun olduğunu önerdi.

Bununla birlikte, bshAIX 7'ye (Bourne kabuğu olduğu iddia edilir) uygulanmasının aslında şu davranışa sahip olduğu ortaya çıkıyor:

> bsh
$ ls ^ wc
      23      23     183
$ ls | wc
      23      23     183

Denediğim diğer "Bourne kabuğu" uygulamalarının hiçbiri bu şekilde davranmadı (yani ^hiç bir kabuk metakarakteri olarak kabul edilmez). shCentOS (ki gerçekten bash olan) ve shFreeBSD (ki bash olmayan) üzerinde denedim . Denemek için çok fazla sistemim yok.

Bu davranış bekleniyor mu? Hangi mermiler ^bir boru metakaraktı olarak kabul edilir?


1
Bunun ^zsh ve ayrıca normal ifade alanında bir olumsuzlama karakteri olduğunu biliyorum . Ayrı bir yorum olarak, genellikle kabuklar arasında taşınabilirlik için grep ifadesinde tek tırnak kullanılması önerilir.
mkc

Bourne kabuğu, modern kabuk kodunda hala etrafta çalıştığımızı gördüğümüz birçok garip davranışa sahipti [ x"$foo" = x"bar" ].
jordanm

bshBourne Kabuğu değil. Bu ad yalnızca AIX'deki Bourne Kabuğu için kötüye kullanılır. bsh1984 yılında H.Berhold AG'de UNOS'ta (ilk UNIX klonu) tanıdığım bir kabuk.
AIX'in

Yanıtlar:


21

^Eş anlamlısı olarak karakter |tarihlerinden geri Thompson kabuğu . Aynı zamanda Unix v4'te tanıtıldı ve kılavuz sayfasında birlikte belirtildi . Sven Mascheck , yazmanın “biraz acı çektiği^ ” büyük olasılıkla erken büyük terminallerde rahatlık nedeniyle “muhtemelen [tanıtıldığından” bahsediyor .|

Thompson kabuğu çoktan gitti, ancak halefi Bourne kabuğu aynı sözdizimini korudu (sadece sayfa sayfasında bahsedilse bile |).

Kül, bash ve ksh gibi halef kabukları sadece |boru karakteri olarak anlar . Açık kaynak unix varyantlarında gerçek bir Bourne kabuğu bulamazsınız, çünkü uzun bir süre Bourne kabuğunun açık kaynaklı bir sürümü yoktu. (Sanırım OpenSolaris bir tane içeriyordu, ancak o zamana kadar yeni uygulamalar tarafından uzun süredir kullanılmadığı için başka bir yerde benimsenmedi).

Tek Unix şartname söz etmez ^etkin bir POSIX kabukları o literally¹ yorumlamak gerektiği anlamına gelir özel bir karakteri olarak. Bourne kabuğunun tam olarak POSIX uyumlu bir varyantı olduğunu düşünmüyorum (sadece bağımsız uygulamalar).

^seçenek extendedglobetkinleştirildiğinde zsh olarak özeldir , ancak sh uyumluluk modunda değildir. Varsayılan modunda, POSIX'ten birçok yönden sapar.

^Anlaşılır olması için düzenli ifadelerde alıntı yapmayı öneriyorum . Komut dosyasında hangi karakterlerin göründüğünden bağımsız olarak normal ifadeyi alıntılayın.

Neg Joker karakter desenindeki parantez ifadesinin ilk karakteri hariç, burada !standart olumsuzlama karakteri vardır, ancak uygulamalar da ^aynı şekilde yorumlanabilir .


Teşekkürler, 2003'teki tüm TUHS iş parçacığı aydınlatıcıydı.
Greg Hewgill

Tamlık için ^, fishbunun bir yönlendirme operatörü olduğu yerde , rc/ esbir birleştirme operatörü olduğu yerde özel olduğunu veya komut satırının ilk karakteri olduğunda tarih genişletmesi için csh / tcsh / bash / zsh olduğunu belirtmek isteyebilirsiniz .
Stéphane Chazelas


3

Evet, OpenSolaris Bourne Shell kaynağını içerir, ancak bu kaynak taşınabilir değildir.

Bir muhafaza ve Bourne Shell kaynağının son derece portatif sürümü bulunabilir buradan içinde schily-*.tar.bz2arşivleri.

İşte kaynağın ilgili kısmı cmd.c:

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

Görüyorsunuz, bu belirli bir kabukla (ör. Thompson kabuğu) değil, 1970'lerde hala büyük harflerle çevrili olan terminallerle ilgilidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.