ERR
trap
не сработает, если код ошибки будет немедленно «перехвачен», что означает, что вы можете использовать операторы if
и т. д. без необходимости постоянно включать и выключать перехват ошибок.. Однако вы не можете использовать проверку $?
для управления потоком, потому что, когда вы доберетесь до этой проверки, у вас уже (может быть )неперехваченная ошибка.
Если у вас есть команда, которую вы ожидаете с ошибкой --, и вы не хотите, чтобы эти сбои вызывали trap
, вам просто нужно отловить ошибку. Оборачивать их в оператор if
неуклюже и многословно, но это сокращение прекрасно работает:
/bin/false || : # will not trigger an ERR trap
Однако, если вы хотите что-то сделать, когда команда не удалась, if
здесь подойдет:
if ! /bin/false; then
echo "this was not caught by the trap!"
fi
Или, альтернативно, else
также перехватывает состояние ошибки:
if /bin/false; then
: # dead code
else
echo "this was not caught by the trap!"
fi
В целом, set -e
и trap "command" ERR
отключаются только в том случае, если существует условие ошибки, которое не учитывается немедленно и по существу.
Извините за такой поздний ответ. Я тоже искал ответ минуту назад. Оказывается это легко. Вам нужно передать его в качестве входного аргумента при вызове dmenu, например:
dmenu_run -hp pcmanfm,lf,st,code
или:
dmenu_run -hp $(cat hpList)