"установить -e" в подстановке оболочки и команды - PullRequest
4 голосов
/ 30 декабря 2010

В сценариях оболочки set -e часто используется, чтобы сделать их более устойчивыми, останавливая сценарий, когда некоторые команды, выполняемые из сценария, завершаются с ненулевым кодом выхода.

Обычно легко указать, чтоВы не заботитесь о некоторых командах, выполняющихся успешно, добавляя || true в конце.

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

output=$(possibly-failing-command)
if [ 0 == $? -a -n "$output" ]; then
  ...
else
  ...
fi

Здесь мы хотим как проверить код выхода (таким образом, мы не можем использовать || true внутри выражения подстановки команд), так и получить вывод.Тем не менее, если команда в подстановке команд завершается неудачно, весь сценарий останавливается из-за set -e.

Есть ли чистый способ предотвратить остановку сценария здесь без сброса -e и последующей его настройки?

1 Ответ

4 голосов
/ 30 декабря 2010

Да, встроить подстановку процесса в оператор if

#!/bin/bash

set -e

if ! output=$(possibly-failing-command); then
  ...
else
  ...
fi

Сбой команды

$ ( set -e; if ! output=$(ls -l blah); then echo "command failed"; else echo "output is -->$output<--"; fi )
/bin/ls: cannot access blah: No such file or directory
command failed

Команда работает

$ ( set -e; if ! output=$(ls -l core); then echo "command failed"; else echo "output is: $output"; fi )
output is: -rw------- 1 siegex users 139264 2010-12-01 02:02 core
...