2017-07-06 98 views
8

Kiedy wykonuję następujące polecenie, na powłoce bash pojawia się błąd, ale na powłoce Korn działa idealnie dobrze. Jedyna różnica polega na tym, że brakuje jednego cudzysłowu na końcu awk po. Czy możesz mi pomóc zrozumieć dlaczego?Dlaczego ksh zezwala na niesparowane cudzysłowy, gdy bash tego nie robi?

echo `echo "a b c d" | awk '{ print $1 }` 
+6

ksh jest po prostu błędne, cytaty muszą być sparowane xor. –

+0

Nie daje również błędu w moim ksh, (os x). Zaskakujący! – jas

+6

Błąd jest prawidłowym zachowaniem, więc wygląda na to, że działa idealnie w bashu, ale niepoprawnie w Korn, a nie na odwrót. –

Odpowiedz

1

W powłoce Korna, oba tylne kleszcze i cytaty można pozostawić sobie równych, tokenizera spróbuje odgadnąć, gdzie albo skończy i dopasować je odpowiednio.

Przykłady:

/home/ufierro # echo "`echo ah" 
+ echo ah 
+ echo ah 
ah 

/home/ufierro # echo `echo 'hello world` 
+ echo 'hello world' 
+ echo hello world 
hello world 

Wskazówki jak oba przykłady pokazują inną sprawę do zachowania wspomnianej powyżej. Pierwszy przykład pokazuje, w jaki sposób pojedynczy tykot w cudzysłowie został ukończony podczas analizowania, a drugi przykład pokazuje, w jaki sposób został zakończony pojedynczy cudzysłów wewnątrz tyknięć.

+0

Dzięki. Domyśliłem się, że może to być próba zgadywania, ale chciałem wiedzieć, dlaczego: Czy nie byłoby to podatne na błędy, czy też jest jakaś konkretna logika, żeby tak nie było? – user1578026

+0

To naprawdę specyficzne zachowanie, które występuje tylko w określonym zestawie cytatów/tyknięć wstecz, pasuje do analizowanego tokenu i próbuje zakończyć cytowanie, aby zapobiec błędom, naprawdę brzydkiemu, ale nie podatnemu na błędy, chyba że masz zamiar zrobić błąd tą drogą. –