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

Выполнить команду оболочки из оболочки script без остановки при возникновении ошибки

В какой-то форме try/catch я хочу выполнить bash, который не останавливается, если возникает ошибка.

Конкретный bash:

#!/bin/sh

invoke-rc.d tomcat stop

rm -fr /var/webapps/
cp -R $WEBAPP /var/webapps/
invoke-rc.d tomcat start

Я хочу выполнить exec "invoke-rc.d tomcat stop", и даже если Tomcat не запущен, продолжайте выполнение других команд bash.

4b9b3361

Ответ 1

Try:

invoke-rc.d tomcat stop > /dev/null 2>&1 || true

Немного фона:

[email protected]: # true
[email protected]: # echo $?
0
[email protected]: # false
[email protected]: # echo $?
1

[email protected]: # which true
/bin/true
[email protected]: # which false
/bin/false

Реальное решение смотрит на tomcat init script, чтобы узнать, как он знает, работает ли tomcat:) Таким образом, вы не обращаете внимание на него бесполезно.

См. этот пост по другому предложению unset/set + e. Хотя это решит вашу непосредственную проблему, вы можете обнаружить, что вам нужно последнее неустановленное поведение в вашем собственном script, тем более, что вы копируете файлы.

Это одна из самых больших причин, почему были сделаны истинные и ложные, за исключением того, что make файлы выполнялись так, как ожидалось, в различных средах сборки.

Кроме того, set + e не является полностью переносимым, то есть некоторыми версиями Solaris (и даже Dash).. но я сомневаюсь, что это беспокоит вас.

Ответ 2

Отключите параметр "exit немедленно" с помощью set +e, запустите команду, а затем дополнительно включите ее с помощью set -e:

set +e
invoke-rc.d tomcat stop
set -e  # optional

См. раздел 4.3.1 руководства Bash для объяснения встроенного set и всех его различных опций (из которых их много).

Ответ 3

Используйте bash установить команду, чтобы временно отключить поведение при выходе из ненулевого состояния.

set +e
invoke-rc.d tomcat stop
set -e

Ответ 4

Если invoke-rc.d tomcat stop - это единственное, что вы хотите защитить от сбоя, возможно, invoke-rc.d tomcat stop || true может это сделать? Это никогда не должно иметь ненулевой статус выхода.

Ответ 5

Попробуйте перенаправить стандартную ошибку в файл... что-то вроде 2 > myerror.