检查bash中是不是存在程序
Posted
技术标签:
【中文标题】检查bash中是不是存在程序【英文标题】:Check if a program exists in bash检查bash中是否存在程序 【发布时间】:2011-02-06 05:05:17 【问题描述】:我正在尝试检查 Solaris 上是否存在 md5sum 或摘要,并且脚本是否在不同的机器上使用。
这是从 ksh 脚本调用的 sh 脚本中的函数
getMD5cmd ()
PATH="$PATH:/bin:/usr/bin:/usr/sfw/bin:/usr/local/bin:/usr/sbin/bin"
if type -p md5sum;then
MD5CMD=`type -p md5sum`
elif type -p digest;then
MD5CMD="`type -p digest` -a md5"
fi
echo "HERE $MD5CMD"
当我运行脚本时,我得到了
-p not found
md5sum not found
-p not found
digest is /bin/digest
HERE
但是,当我在终端中输入它时,会按预期工作
有什么想法吗? 谢谢
【问题讨论】:
【参考方案1】:在设置 PATH 时,似乎没有必要知道命令的确切位置。
getMD5cmd ()
PATH=$PATH:/bin:/usr/bin:/usr/sfw/bin:/usr/local/bin:/usr/sbin/bin
md5sum /dev/null >/dev/null 2>&1 && MD5CMD=md5sum || MD5CMD="digest -a md5"
echo "HERE $MD5CMD"
getMD5cmd
【讨论】:
我对确切的路径不感兴趣。该脚本位于用户 home/bin 上,根据用户登录的机器,我不知道系统上存在哪些命令。【参考方案2】:您可能正在为您的交互式 shell 运行 ksh
或 Bash。这两个都有-p
选项type
。运行脚本的 shell(可能是 sh
)具有 type
,但没有 -p
选项,因此它正在寻找“-p”作为可执行文件的名称,但没有找到它。
因此您可以将脚本更改为使用ksh
,或者您可以使用which
程序。后者可能更便携,因为有些系统没有ksh
。
【讨论】:
我不敢相信我能变得多么天真,甚至从来没有想过。感谢您对此有所了解。我现在将脚本转换为 bash 并且我的代码有效 哦,好吧,我将脚本转换为 bash 并最终使用了您的建议【参考方案3】:if which md5sum >/dev/null 2>&1; then
md5cmd="md5sum"
elif which digest >/dev/null 2>&1; then
md5cmd="digest -a md5"
else
echo "No md5 command found" >&2
exit 1
fi
$md5cmd YOUR_FILE
【讨论】:
第一个条件评估为真,即使机器上没有 md5sum 也是如此 我认为原因是“哪个”在 Solaris 上总是有输出,当找不到命令时,响应是“在 /usr/bin /vol2/bin 中没有 md5sum”【参考方案4】:您是否尝试过以下语法:
MD5CMD="$(type -p md5sum digest |sed -e 's/digest$/digest -a md5/' |head -1)"
if [ -z "$MD5CMD" ]; then
echo 'no md5 sum command found' >&2
exit 1
fi
echo "HERE $MD5CMD"
我在 Cygwin 中试过这个,type
会返回多行,所以它可以工作。
【讨论】:
以上是关于检查bash中是不是存在程序的主要内容,如果未能解决你的问题,请参考以下文章
Bash,...检查是不是安装了程序,使用 bash 脚本 [重复]