Oto przykład:
$ (newline=$'\n'; bash -c "trap 'trap ERR; echo handler' ERR; set -e;${newline}/bin/false")
Program obsługi wykona, jeśli wykonam jedną z następujących czynności:
- usuń nową linię
- zamiast tego pułapka na EXIT
- dodaj kolejne polecenie na końcu
Podejrzewam, że bash ma optymalizację, aby wywołać exec tylko wtedy, gdy jest tylko jedno polecenie, a nowa linia, po której następuje pojedyncze polecenie, uruchamia ją.
Mam dowody poszlakowe: uciekłem podstępem; wcześniejsze cmds będą vfork, a następnie wykonają, ale ostatni wywołuje tylko execv.
Wpadłem na to z GNU make używając .ONESHELL i pułapki, aby wydrukować kod wyjścia i nazwę pliku dziennika, ale jeśli ostatnia rzecz się nie powiedzie, pułapka nie zostanie wykonana.
Z góry dziękuję.
Odpowiedzi:
Zapomniałem o tym pytaniu. Dodałem poprawkę do basha w 2016 roku :
Jak spekulowałem w moim pytaniu, bash rzeczywiście ma optymalizacje. Minęło trochę czasu, odkąd spojrzałem na kod, ale mniej więcej to robi:
exec()
funkcja rodziny, a następnie zrób toMoja poprawka polegała na dodaniu do definicji „nie wymaga pomocy ze strony powłoki” poprzez sprawdzenie, czy działają pułapki.
źródło