Подтвердить что ты не робот

Как избежать bash script от отказа при установке опции -e?

У меня есть параметр bash script с параметром -e, который сбрасывает весь script при первой ошибке.

В script я пытаюсь сделать ls в каталоге. Но этот путь может или не может существовать. Если путь не существует, команда ls завершается с ошибкой, так как установлен флаг -e.

Есть ли способ, с помощью которого я могу предотвратить потерю script?

Как побочная заметка, я пробовал трюк сделать set +e и set -e до и после этой команды, и он работает. Но я ищу лучшее решение.

4b9b3361

Ответ 1

Вы можете "поймать" ошибку, используя ||, и команда, которая должна выйти из состояния 0:

ls $PATH || echo "$PATH does not exist"

Поскольку составная команда преуспевает в том, существует или нет $PATH, set -e не запускается, а ваш script не будет завершен.

Чтобы подавить ошибку беззвучно, вы можете использовать команду true:

ls $PATH || true

Чтобы выполнить несколько команд, вы можете использовать одну из составных команд:

ls $PATH || { command1; command2; }

или

ls $PATH || ( command1; command2 )

Просто убедитесь, что ничего не происходит внутри любой из составных команд. Одним из преимуществ второго примера является то, что вы можете отключить режим немедленного выхода внутри подоболочки, не влияя на его статус в текущей оболочке:

ls $PATH || ( set +e; do-something-that-might-fail )

Ответ 2

Другим вариантом является использование trap для улавливания сигнала EXIT:

trap 'echo "ls failed" ; some_rescue_action' EXIT
ls /non_exist

Ответ 3

одно решение будет проверять наличие папки

function myLs() {
    LIST=""
    folder=$1
    [ "x$folder" = "x" ] && folder="."
    [ -d $folder ] && LIST=`ls $folder`
    echo $LIST
}

Таким образом, bash не сработает, если $folder не существует