我有一堆通过 ssh 运行的 bash 命令:
#!/bin/bash
CMD="
set -e
cmd1
cmd2
# ........
service my_service stop
# .........
# some commands here......
# .........
service my_service start
"
ssh -t -A -q -C $SERVER@$HOST "$CMD"
有时,每当my_service
恰好处于停止状态时,命令service my_service stop
就会返回以下内容:
--rpc-eval : RPC failed with reason :nodedown # it's an Erlang app, hence a response
./my_script.sh: línea 26: error: orden no encontrada
由于该命令被视为失败,由于某种原因,它将终止执行,退出会话,从而无法到达该命令service my_service start
。
但我希望它始终运行stop
和以及start
介于两者之间的命令,当然,不管命令之前应用程序的状态如何service stop
,并且不会失败,或者在“服务停止”后尽管可能出现故障仍继续运行
怎么做?
答案1
您的脚本指定了set -e
,如果脚本中的任何命令返回错误,则会导致 shell 退出。如果您省略此项,则默认情况下,如果有任何命令返回错误,脚本将继续。
如果您希望保留set -e
并仅在特定命令返回错误时继续,则可以使用控制运算符 让脚本忽略命令中的错误||
,该控制运算符告诉 shell 在第一个命令失败时执行另一个命令。然后通过指定内置命令:
,它不执行任何操作,只是成功返回(类似于true
您也可以使用的命令)。
例如:
service my_service stop || :
如果service
命令失败,则 shell 将执行:
并返回成功,并且脚本将继续执行。