Z podręcznika użytkownika Bash :
${parameter:?word}
Jeśli parameter
jest zerowy lub nieustawiony, rozwinięcie word
(lub komunikat o takim skutku, jeśli word
nie jest obecny) jest zapisywany do standardowego błędu i powłoka, jeśli nie jest interaktywna, kończy działanie. W przeciwnym razie wartość parameter
zostanie podstawiona.
Może to nie być oczywiste, ale „błąd standardowy” oznacza tutaj standardowy błąd powłoki . Kiedy to robisz echo … 2> testfile
, przekierowujesz standardowy błąd echo
. Oba zwykle kończą w twoim terminalu, ale nie są takie same.
Aby to działało, jak chcesz tworzyć podpowłoce i przekierować jego błąd standardowy:
(echo ${var:?"This var is not set"}) 2> testfile
Będzie to również działać:
{ echo ${var:?"This var is not set"}; } 2> testfile
Zauważ, że faktyczna komenda ( echo
) odziedziczy już przekierowany standardowy błąd podpowłoki, więc skutecznie to przekierowanie wpływa na oba z nich. Prawie nigdy nie ma znaczenia, kiedy polecenie jest, echo
ale robi to z poleceniem, które zwraca komunikat o błędzie. Porównać:
unset var
(dd ${var:?"This var is not set"}) 2> testfile
cat testfile
var=foo
(dd ${var:?"This var is not set"}) 2> testfile
cat testfile