如何处理 bash 中的"command not found"



我有一个脚本来检查我的环境,我想就如何处理"找不到命令"错误征求您的建议。

echo "...RVM Version      : $(rvm -v)"
echo "...Node Version     : $(node -v)"
echo "...Ruby Version     : $(ruby -v)"
echo "...Bundler Version  : $(bundle -v)"
echo "...Passenger Version: $(passenger -v)"

它显示node的"找不到命令"和passenger命令:

...RVM Version      : rvm 1.29.7 (latest) by Michal Papis
deploy_confirm.sh: line 10: node: command not found
...Node Version     : 
...Ruby Version     : ruby 2.6.0p0 (2018-12-25 revision 66547)
...Bundler Version  : Bundler version 2.0.1
deploy_confirm.sh: line 13: passenger: command not found
...Passenger Version: 

与其显示错误,不如显示"未找到",如下所示:

...RVM Version      : rvm 1.29.7 (latest) by Michal Papis
...Node Version     : Not found
...Ruby Version     : ruby 2.6.0p0 (2018-12-25 revision 66547)
...Bundler Version  : Bundler version 2.0.1
...Passenger Version: Not found

如果使用 bash>= 4.0,请在第一echo行之前插入以下内容:

command_not_found_handle() { echo "not found"; return 127; }

然后在最后一行echo之后插入它以摆脱此功能:

unset command_not_found_handle

输出,例如:

。RVM 版本 : 未找到 ...节点版本 : v4.2.6 ...Ruby 版本 : ruby 2.3.1p112 (2016-04-26) [x86_64-linux-gnu] ...捆绑器版本:未找到 ...乘客版本:未找到

包装器函数是获取自定义行为的简单方法,尤其是在不希望全局更改该行为的情况下。

or_not_found() {
if type "$1" >/dev/null 2>&1; then # if given a valid command
"$@"                             # run that command with original arguments
else
echo "Not found"  # write to stdout so it's captured by the command substitution
fi
}
echo "...Login Shell User : $USER"  # much more efficient than calling whoami
echo "...RVM Version      : $(or_not_found rvm -v)"
echo "...Node Version     : $(or_not_found node -v)"
echo "...Ruby Version     : $(or_not_found ruby -v)"
echo "...Bundler Version  : $(or_not_found bundle -v)"
echo "...Passenger Version: $(or_not_found passenger -v)"

使用2>/dev/null禁止显示错误消息,并||作为else的简写。 如果命令a失败,a || b将运行b

echo "...Login Shell User : $(whoami)"
echo "...RVM Version      : $(rvm -v 2>/dev/null || echo 'Not found')"
echo "...Node Version     : $(node -v 2>/dev/null || echo 'Not found')"
echo "...Ruby Version     : $(ruby -v 2>/dev/null || echo 'Not found')"
echo "...Bundler Version  : $(bundle -v 2>/dev/null || echo 'Not found')"
echo "...Passenger Version: $(passenger -v 2>/dev/null || echo 'Not found')"

最新更新