检查bash中是否存在程序

时间:2010-04-09 15:30:30

标签: bash shell solaris

我正在尝试检查solaris上是否存在md5sum或摘要,并且脚本在不同的计算机上使用。

这是sh脚本中从ksh脚本调用的函数

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

但是,当我在终端中键入它时,可以作为已检测到的

任何想法? 感谢

4 个答案:

答案 0 :(得分:2)

您可能正在为交互式shell运行ksh或Bash。这两者都有-p的{​​{1}}选项。您的脚本运行的shell(可能是type)有sh但没有type选项,因此它正在寻找“-p”作为可执行文件的名称找不到它。

因此,您可以更改脚本以使用-p,也可以使用ksh程序。后者可能更具可移植性,因为有些系统没有which

答案 1 :(得分: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

答案 2 :(得分:0)

您是否尝试过以下语法:

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会返回多行,因此可以正常工作。

答案 3 :(得分:0)

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