Napisałem dzisiaj mały skrypt, który zawierał
grep -q ^local0 /etc/syslog.conf
Podczas przeglądu współpracownik zasugerował, aby ^local0
go zacytować, ponieważ ^
oznacza „fajkę” w powłoce Bourne'a. Zaskoczony tym twierdzeniem, próbowałem wyśledzić wszelkie odniesienia, które o tym wspominały. Nic, co znalazłem w Internecie, nie sugerowało, że to był problem.
Okazuje się jednak, że implementacja bsh
(która twierdzi, że jest powłoką Bourne'a) w systemie AIX 7 faktycznie ma takie zachowanie:
> bsh
$ ls ^ wc
23 23 183
$ ls | wc
23 23 183
Żadna z innych implementacji „powłoki Bourne'a”, które próbowałem, nie zachowuje się w ten sposób (to ^
znaczy wcale nie jest uważana za metaznak powłoki). Próbowałem sh
na CentOS (który jest naprawdę bash) i sh
na FreeBSD (który nie jest bash). Nie mam wielu innych systemów do wypróbowania.
Czy to zachowanie jest oczekiwane? Które pociski uważają ^
za metaznak rury?
źródło
^
to znak negacji w Zsh, a także w przestrzeni wyrażeń regularnych. W ramach oddzielnego komentarza zaleca się stosowanie pojedynczych cudzysłowów w wyrażeniu grep w celu przenoszenia między powłokami.[ x"$foo" = x"bar" ]
.bsh
to nie jest Bourne Shell. Nazwa jest nadużywana tylko dla powłoki Bourne Shell tylko w systemie AIX.bsh
jest raczej powłoką wprowadzoną przeze mnie w 1984 r. w H.Berhold AG na UNOS (pierwszy klon UNIX). Zauważ, że AIX nie istniał w 1984 roku.Odpowiedzi:
^
Charakter jako synonim|
sięga od skorupy Thompson . Zostały one wprowadzone w tym samym czasie w Uniksie v4 i są wymienione razem na stronie podręcznika . Sven Mascheck wspomina, że^
„prawdopodobnie [wprowadzono] ze względu na wygodę we wczesnych terminalach z dużymi literami ”, gdzie pisanie|
było „nieco uciążliwe” .Powłoka Thompsona dawno już minęła, ale następca powłoki Bourne zachował tę samą składnię (mimo że strona podręcznika wspomina tylko
|
).Pociski następcy, takie jak ash, bash i ksh, rozumieją tylko
|
jako znak potoku. Nie znajdziesz prawdziwej powłoki Bourne'a w wariantach unixowych Open Source, ponieważ przez długi czas nie było wydania otwartej wersji powłoki Bourne'a. (Myślę, że OpenSolaris zawierał jeden, ale nie został przyjęty gdzie indziej, ponieważ do tego czasu był już przestarzały przez nowsze implementacje).Specyfikacja Single Unix nie wspomina
^
o znaku specjalnym, co oznacza, że powłoki POSIX powinny ją interpretować dosłownie¹. Nie sądzę, żeby kiedykolwiek istniał w pełni zgodny z POSIX wariant powłoki Bourne'a (tylko niezależne implementacje).^
jest specjalny w zsh, gdy opcjaextendedglob
jest włączona, ale nie w trybie zgodności sh. W trybie domyślnym różni się od POSIX na wiele sposobów.W
^
każdym razie polecam cytowanie wyrażenia regularnego. Cytuj wyrażenie regularne w skrypcie, niezależnie od tego, jakie znaki się w nim pojawiają.¹ Z wyjątkiem pierwszego znaku wyrażenia nawiasowego we wzorze wieloznacznym, gdzie
!
jest standardowym znakiem negacji, ale implementacje mogą również interpretować^
w ten sam sposób.źródło
^
jest to wyjątkowe,fish
gdy jest operatorem przekierowania,rc
/es
gdzie jest operatorem konkatenacji , lub csh / tcsh / bash / zsh do ekspansji historii, gdy jest to pierwszy znak wiersza poleceń.Okazuje się, że
^
wydaje się to nieudokumentowaną cechą powłoki SVR 4.2. Z GNU Bash Dodatek B Główne różnice w stosunku do powłoki Bourne'a :źródło
Tak, OpenSolaris zawiera źródło Bourne Shell, ale to źródło nie jest przenośne.
Utrzymywana i wysoce przenośna wersja źródła Bourne Shell znajduje się tutaj w
schily-*.tar.bz2
archiwach.Oto pokrewna część źródła w
cmd.c
:Widzisz, nie jest to związane z konkretną powłoką (np. Powłoką Thompsona), ale z faktem, że w latach 70. XX wieku wciąż istniały tylko wielkie litery.
źródło