Uso di ^ come metacarattere di shell


19

Oggi ho scritto una piccola sceneggiatura che conteneva

grep -q ^local0 /etc/syslog.conf

Durante la revisione, un collega ha suggerito di ^local0essere citato perché ^significa "pipe" nella shell Bourne. Sorpreso da questa affermazione, ho cercato di rintracciare qualsiasi riferimento che menzionasse questo. Nulla di ciò che ho trovato su Internet ha suggerito che questo fosse un problema.

Tuttavia, si scopre che l'implementazione di bsh(che afferma di essere la shell Bourne) su AIX 7 ha effettivamente questo comportamento:

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

Nessuna delle altre implementazioni "Bourne shell" che ho provato si comporta in questo modo (ovvero, ^non è affatto considerata un metacarattere shell). Ho provato shsu CentOS (che è davvero bash) e shsu FreeBSD (che non è bash). Non ho molti altri sistemi da provare.

Questo comportamento è previsto? Quali conchiglie considerano ^un metacarattere pipe?


1
So che ^è un carattere di negazione in zsh e anche nello spazio regex. Come commento separato, si consiglia generalmente di utilizzare virgolette singole nell'espressione grep per la portabilità tra shell.
MKC

La shell bourne ha avuto un sacco di comportamenti strani per i quali vediamo ancora dei problemi nel moderno codice della shell, ad es [ x"$foo" = x"bar" ].
Giordania,

bshnon è la Bourne Shell. Il nome viene abusato solo per Bourne Shell su AIX. bshè piuttosto una shell introdotta da me nel 1984 presso H.Berhold AG su UNOS (il primo clone UNIX). Si noti che AIX non esisteva nel 1984.
schily

Risposte:


21

Il ^personaggio come sinonimo di |risale alla shell Thompson . Sono stati introdotti contemporaneamente in Unix v4 e sono menzionati insieme nella pagina man . Sven Mascheck menziona che è ^stato "probabilmente [introdotto] per ragioni di convenienza sui primi terminali maiuscoli" dove digitazione |era "un po 'un dolore" .

La shell Thompson è sparita da tempo, ma il suo successore è il shell Bourne ha mantenuto la stessa sintassi (anche se la sua pagina man menziona solo |).

Le shell successive come ash, bash e ksh comprendono solo |il carattere pipe. Non troverai una vera shell Bourne su varianti unix open source poiché da molto tempo non esiste una versione open source della shell Bourne. (Penso che OpenSolaris ne includesse uno, ma non era stato adottato altrove poiché a quel tempo era ormai obsoleto da implementazioni più recenti).

La specifica Single Unix non menziona^ come un carattere speciale, il che significa che le shell POSIX dovrebbero interpretarlo letteralmente¹. Non credo che ci sia mai stata una variante completamente conforme POSIX della shell Bourne (solo implementazioni indipendenti).

^ è speciale in zsh quando l'opzione extendedglob è abilitata, ma non nella sua modalità di compatibilità sh. Nella sua modalità predefinita, si discosta da POSIX in molti modi.

Raccomando comunque di citare ^un'espressione regolare per chiarezza. Cita l'espressione regolare in una sceneggiatura a prescindere da quali caratteri appaiono in essa.

¹ Tranne il primo carattere di un'espressione tra parentesi in un modello jolly, dove !è il carattere di negazione standard ma le implementazioni possono anche interpretare ^allo stesso modo.


Grazie, l'intero thread TUHS del 2003 è stato illuminante.
Greg Hewgill,

Per completezza, potresti voler menzionare che ^è speciale in fishcui è un operatore di reindirizzamento, rc/ esdove è un operatore di concatenazione o csh / tcsh / bash / zsh per l'espansione della cronologia quando è il primo carattere della riga di comando.
Stéphane Chazelas,


3

Sì, OpenSolaris include la fonte Bourne Shell ma quella fonte non è portatile.

Una versione mantenuta e altamente portatile della fonte Bourne Shell può essere trovata qui negli schily-*.tar.bz2archivi.

Ecco la parte correlata della fonte in cmd.c:

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

Vedete, questo non è correlato a una shell specifica (ad esempio la shell Thompson) ma al fatto che negli anni '70 c'erano ancora solo terminali maiuscoli.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.