我有一个环境设置脚本,我想在其中提醒用户我正在执行哪些命令(即正在安装的命令)。使用set -x
会使输出过于混乱,因此我有一个successfully
重要的命令被调用的函数:
#!/bin/bash
trap "exit 1" TERM
export TOP_PID=$$
real_exit() {
echo -e "Goodbye :'("
kill -s TERM $TOP_PID
}
successfully() {
echo -e "$*"
$* || (echo -e "\nFailed. Check output and then retry, please." 1>&2 && real_exit)
}
例如,我可以调用successfully brew update
脚本,如果脚本失败,则用户知道该脚本执行失败的命令,脚本停止。
但是,当我尝试安装Ruby / RVM时,我的脚本失败了:
successfully "curl -L https://get.rvm.io | bash -s stable --ruby"
当我从命令行调用curl命令时,它可以正常工作,但是当脚本出现错误时,它会失败:
curl -L https://get.rvm.io | bash -s stable --ruby
curl: option --ruby: is unknown
curl: try 'curl --help' or 'curl --manual' for more information
您将需要使用eval,但不建议这样做。
successfully() {
echo -e "$1"
eval "$1" || (echo -e "\nFailed. Check output and then retry, please." 1>&2 && real_exit)
}
同时发送SIGHUP而不是SIGTERM:
kill -s SIGHUP "$TOP_PID"
您也可以使用以下安全变体:
successfully() {
local __A=() __I
for (( __I = 1; __I <= $#; ++__I )); do
if [[ "${!__I}" == '|' ]]; then
__A+=('|')
else
__A+=("\"\$$__I\"")
fi
done
echo "$@"
eval "${__A[@]}" || (echo -e "\nFailed. Check output and then retry, please." 1>&2 && real_exit)
}
例子:
successfully curl -L https://get.rvm.io \| bash -s stable --ruby ## You just have to quote pipe.
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句