Как я могу написать сценарий оболочки HUSH, который проверяет результат каждой команды?

Мне удалось объединить тайм-аут ( sleep ), внешний heredoc, внутренний heredoc (s), nohup , обработку на уровне фона и tty-stdout в следующем скрипте.

Это хорошо, если вам нужен быстрый способ установить что-то, а затем автоматически удалить это через некоторое время:

bash /dev/fd/5 5<< 'EOF0'
#!/bin/bash -x

apt-get install SOME_UTILITY1 -y

cat << EOF1 > ~/utility.sh
sleep 1h
apt-get purge SOME_UTILITY1 -y
EOF1

chmod 755 ~/utility.sh &
nohup ~/utility.sh &

EOF0

Нажмите return (Enter), когда получите следующее сообщение, чтобы продолжить нормальную работу в Bash (появится сообщение в тот момент, когда скрипт достигает nohup :

nohup: добавление вывода в '/USER_LOCATION/nohup.out'

1
13.02.2017, 23:57
2 ответа

Добавьте set -e в начале скрипта или измените #! строка #! / Bin / sh -e , которая будет иметь такой же эффект.

Устанавливает параметр оболочки errexit , что означает, что сценарий завершится, как только команда вернет ненулевой статус выхода, со следующими исключениями (взятыми из описания POSIX of set ):

  1. Отказ любой отдельной команды в конвейере с несколькими командами не должен вызывать завершение работы оболочки. Учитывается только отказ самого трубопровода.

  2. Параметр -e должен игнорироваться при выполнении составного списка после , а , до , если ] или elif зарезервированное слово, конвейер , начинающийся с ! зарезервированное слово или любая команда из списка И-ИЛИ, кроме последней.

  3. Если статус выхода составной команды, отличной от команды подоболочки , был результатом сбоя, в то время как -e игнорировалось, то - e не применяется к этой команде.

В качестве альтернативы можно добавить || выходите после каждой команды, после которой вы хотите выйти, если они не работают. Например,

flash_eraseall -j /dev/mtd2 || exit
1
27.01.2020, 23:46

После каждой команды в bash код возврата сохраняется в переменной $? . Если команда выполнена успешно, ее значение должно быть

successfulcommand    
echo $?
0

. В случае ошибки результат не равен нулю и зависит от ошибки.

unsuccessfulcommand
echo $?
2
0
27.01.2020, 23:46

Теги

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