Używam potoku kilku poleceń w bash. Czy istnieje sposób na skonfigurowanie bash, aby natychmiast zakończyć wszystkie polecenia w całym potoku w przypadku niepowodzenia jednego z poleceń?Rurka powłoki: zamknij się natychmiast, jeś li nie powiedzie się jedna komenda.
W moim przypadku pierwsze polecenie, na przykład command1
, działa przez chwilę, dopóki nie wygeneruje jakiegoś wyjścia. Możesz na przykład wstawić command1
przez (sleep 5 && echo "Hello")
.
Teraz, command1 | false
kończy się niepowodzeniem po 5 sekundach, ale nie natychmiast.
To zachowanie wydaje się mieć związek z ilością danych wyjściowych generowanych przez polecenie. Na przykład: find/| false
natychmiast zwraca.
Ogólnie zastanawiam się, dlaczego bash zachowuje się w ten sposób. Czy ktokolwiek może sobie wyobrazić jakąkolwiek sytuację, w której użyteczne jest, aby kod taki jak command1 | non-existing-command
nie wychodził jednocześnie?
PS: Używanie plików tymczasowych nie jest dla mnie opcją, ponieważ wyniki pośrednie, które przeglądam, są duże, aby je przechowywać.
PPS: Ani set -e
ani set -o pipefail
wydają się mieć wpływ na to zjawisko.
To pytanie jest lepiej dostosowane do http://unix.stackexchange.com. Prawdopodobnie dostaniesz tam dobrą odpowiedź. – dogbane