Мне удалось объединить тайм-аут ( 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'
Добавьте set -e
в начале скрипта или измените #!
строка #! / Bin / sh -e
, которая будет иметь такой же эффект.
Устанавливает параметр оболочки errexit
, что означает, что сценарий завершится, как только команда вернет ненулевой статус выхода, со следующими исключениями (взятыми из описания POSIX of set
):
Отказ любой отдельной команды в конвейере с несколькими командами не должен вызывать завершение работы оболочки. Учитывается только отказ самого трубопровода.
Параметр -e
должен игнорироваться при выполнении составного списка
после , а
, до
, если
] или elif
зарезервированное слово, конвейер
, начинающийся с !
зарезервированное слово или любая команда
из списка И-ИЛИ, кроме последней.
Если статус выхода составной команды, отличной от команды подоболочки
, был результатом сбоя, в то время как -e
игнорировалось, то - e
не применяется к этой команде.
В качестве альтернативы можно добавить || выходите
после каждой команды, после которой вы хотите выйти, если они не работают. Например,
flash_eraseall -j /dev/mtd2 || exit
После каждой команды в bash код возврата сохраняется в переменной $?
. Если команда выполнена успешно, ее значение должно быть
successfulcommand
echo $?
0
. В случае ошибки результат не равен нулю и зависит от ошибки.
unsuccessfulcommand
echo $?
2