如何验证程序是否存在,以返回错误并退出,或继续执行脚本?
看起来应该很容易,但这让我很为难。
如何验证程序是否存在,以返回错误并退出,或继续执行脚本?
看起来应该很容易,但这让我很为难。
当前回答
如果您检查程序是否存在,您可能会稍后运行它。为什么不先尝试运行它?
if foo --version >/dev/null 2>&1; then
echo Found
else
echo Not found
fi
这是一个更值得信赖的检查程序运行,而不仅仅是查看PATH目录和文件权限。
此外,您可以从程序中获得一些有用的结果,例如其版本。
当然,缺点是有些程序启动起来会很重,有些程序没有--version选项可以立即(并成功)退出。
其他回答
我从来没有得到以前的答案来处理我可以访问的盒子。首先,类型已经安装(做更多的事情)。因此需要内置指令。此命令适用于我:
if [ `builtin type -p vim` ]; then echo "TRUE"; else echo "FALSE"; fi
我的Debian服务器设置:
当多个包包含相同的名称时,我遇到了问题。
例如apache2。这就是我的解决方案:
function _apt_install() {
apt-get install -y $1 > /dev/null
}
function _apt_install_norecommends() {
apt-get install -y --no-install-recommends $1 > /dev/null
}
function _apt_available() {
if [ `apt-cache search $1 | grep -o "$1" | uniq | wc -l` = "1" ]; then
echo "Package is available : $1"
PACKAGE_INSTALL="1"
else
echo "Package $1 is NOT available for install"
echo "We can not continue without this package..."
echo "Exitting now.."
exit 0
fi
}
function _package_install {
_apt_available $1
if [ "${PACKAGE_INSTALL}" = "1" ]; then
if [ "$(dpkg-query -l $1 | tail -n1 | cut -c1-2)" = "ii" ]; then
echo "package is already_installed: $1"
else
echo "installing package : $1, please wait.."
_apt_install $1
sleep 0.5
fi
fi
}
function _package_install_no_recommends {
_apt_available $1
if [ "${PACKAGE_INSTALL}" = "1" ]; then
if [ "$(dpkg-query -l $1 | tail -n1 | cut -c1-2)" = "ii" ]; then
echo "package is already_installed: $1"
else
echo "installing package : $1, please wait.."
_apt_install_norecommends $1
sleep 0.5
fi
fi
}
GIT=/usr/bin/git # STORE THE RELATIVE PATH
# GIT=$(which git) # USE THIS COMMAND TO SEARCH FOR THE RELATIVE PATH
if [[ ! -e $GIT ]]; then # CHECK IF THE FILE EXISTS
echo "PROGRAM DOES NOT EXIST."
exit 1 # EXIT THE PROGRAM IF IT DOES NOT
fi
# DO SOMETHING ...
exit 0 # EXIT THE PROGRAM IF IT DOES
检查多个依赖项并向最终用户通知状态
for cmd in latex pandoc; do
printf '%-10s' "$cmd"
if hash "$cmd" 2>/dev/null; then
echo OK
else
echo missing
fi
done
样本输出:
latex OK
pandoc missing
将10调整为最大命令长度。这不是自动的,因为我看不到一种非冗长的POSIX方法:如何在Bash中对齐空格分隔表的列?
检查一些apt包是否与dpkg-s一起安装,否则安装。
请参阅:检查是否安装了apt-get包,如果它不在Linux上,则安装它
前面提到过:如何检查Bash脚本中是否存在程序?
我会尝试调用程序,例如--version或--help,并检查命令是否成功或失败
与set-e一起使用时,如果找不到程序,脚本将退出,您将得到一条有意义的错误消息:
#!/bin/bash
set -e
git --version >> /dev/null