2015-04-18 13 views
8

Byłem trochę zaniepokojony, aby znaleźć następujące zachowanie:

bash$ false 
bash$ true | echo $? 
0 
bash$ ksh 
ksh$ false 
ksh$ true | echo $? 
0 
ksh$ zsh 
zsh$ false 
zsh$ true | echo $? 
1 

Intuicyjnie wygląda zsh dostaje to prawo podczas bash i ksh są błędne. $? jest "stanem wyjściowym ostatnio wykonanego potoku", który w każdym przypadku powinien wynosić 1. Zauważ, że false | echo $? również drukuje 0 w obu ksh i bash. Czy standard jest elastyczny w tym punkcie (tj. Zachowanie jest nieokreślone), czy też są niezgodne z tym standardem? Ciekawi mnie też, co robią bash i ksh, żeby to zepsuć.

$ bash --version 
GNU bash, version 3.2.48(1)-release (x86_64-apple-darwin11) 
Copyright (C) 2007 Free Software Foundation, Inc. 
$ zsh --version 
zsh 4.3.11 (i386-apple-darwin11.0) 
$ ksh --version 
    version   sh (AT&T Research) 1993-12-28 s+ 
+2

Po uruchomieniu przykładu 'bash' otrzymałem' 1', a nie '0'. – lurker

+0

Jaką wersję bash? Wytwarza to samo, co twoje wyjście zsh w moim systemie. – Mat

+0

Proszę podać wersję powłoki proszę dla wszystkich. U mnie 'zsh' faktycznie zwrócił' 0'. Nie można tego zweryfikować. –

Odpowiedz

4

POSIX mówi:

$? Rozszerza do dziesiętnych stanu wyjścia najnowszego [polecenie] lub rurociągu ...

Proszę zwrócić uwagę na komentarz z @lurker. Bash w obecnej wersji 4.3.11 zachowuje się tak samo jak zsh.

Co się dzieje w bash i zsh że $? zostanie ustawiony poleceniem przed rurę i nie zmieniło się wewnątrz rury. Dlatego oczekiwany wynik to wartość zwracana z false ->1. I to właśnie określa POSIX.

Nie można znaleźć żadnej dokumentacji opisującej zachowanie ksh. Mogę tylko przypuszczać, że ksh resetuje $? przed wykonaniem rurę, ponieważ następujący kod działa:

#!/bin/ksh 
false 
ret=$? 
true | echo "$ret" 

Prawdopodobnie to powinien dostać złożony jako błąd w ksh. Jednak nie jestem pewien, czy to zachowanie jest określone wystarczająco dokładnie przez POSIX.

+2

Tak, więc w każdym przypadku '$?' Powinien być stanem zwróconym przez 'false'. Powinien on odnosić się do najnowszego rurociągu, a budowa rurociągu, w którym jest on stosowany, powinna być nieistotna. –

+0

@ hek2mgl Huh? W jaki sposób '$?' W 'echo $?' Rozwija się do statusu wyjścia 'echo'? Jest oceniany przed uruchomieniem 'echo'. Oczywiście, * potem *, "echo" zostanie ustawione na status wyjścia 'echo' (zwykle zero), ale nie o to chodzi w tym pytaniu, czyż nie? – hvd

+0

Tak, widzę to teraz. Głupio było przyjąć "echo" .. – hek2mgl

Powiązane problemy