Как поймать и обработать ненулевой статус выхода в функции Bash?

Я не уверен, что вы понимаете под "session open", но файл .xxxrc для конкретной оболочки вызывается (согласно POSIX) всякий раз, когда запускается интерактивная оболочка.

Это верно как для оболочки входа, так и для вложенной оболочки в текущем сеансе.

4
28.04.2016, 19:32
4 ответа

В set -e отсутствие failfailfail приводит к завершению всего сценария (или подоболочка, если функция выполняется в подоболочке).

Если вам не нужно изменять состояние оболочки из функции, вы можете запустить ее в подоболочке.

myfunc() (
    set -e
    ls
    failfailfail
    uptime
)

Другой подход в bash - установить ловушку ERR для выполнения return . Если вы хотите сделать это локальным параметром, вам нужно восстановить старое значение ловушки, что немного обременительно.

myfunc() {
    local old_ERR_trap=$(trap -p ERR)
    if [[ -z $old_ERR_trap ]]; then old_ERR_trap="trap - ERR"; fi
    trap 'local ret=$?; eval "$old_ERR_trap"; return $ret' ERR
    ls
    failfailfail
    uptime
}
3
27.01.2020, 20:59

Иногда лучше поместить в Makefile, который занимается такими вещами.

#!/bin/bash
myfunc() { # watch out for tabs!
        make -f - <<!
default:
        ls -d
        failfailfail
        uptime
!
}
0
27.01.2020, 20:59

Единственный способ сделать это проще - это объединить все в одной команде, но это усложняет поддержку сценария, чем ваш последняя версия:

myfunc() {
    ls && failfailfail && uptime || return $?
}
0
27.01.2020, 20:59

Учитывая, что все это простые команды, вы можете сделать это примерно так:

myfunc() {
  ls &&
  failfailfail &&
  uptime ||
  return $?
}
0
27.01.2020, 20:59

Теги

Похожие вопросы