Jak przekierować stderr składni $ {var:? „Foo”}?

0

Korzystam z bash i próbuję wydrukować komunikat ze standardowym błędem, jeśli zmienna nie jest ustawiona za pomocą następującego polecenia:

echo ${var:?"This var is not set"}

Teraz chcę przekierować ten komunikat o błędzie do pliku. Próbowałem następujące, ale to nie działało:

echo ${var:?"This var is not set"} > testfile

Ani następujące działania nie działały:

echo ${var:?"This var is not set"} 2> testfile

Jak więc skierować tę wygenerowaną wiadomość do pliku?

Amjad Abdullah
źródło

Odpowiedzi:

0

Z podręcznika użytkownika Bash :

${parameter:?word}

Jeśli parameterjest zerowy lub nieustawiony, rozwinięcie word(lub komunikat o takim skutku, jeśli wordnie jest obecny) jest zapisywany do standardowego błędu i powłoka, jeśli nie jest interaktywna, kończy działanie. W przeciwnym razie wartość parameterzostanie 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, echoale 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
Kamil Maciorowski
źródło