【问题标题】: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

但是,当我在终端中输入它时,会按预期工作

有什么想法吗? 谢谢

【问题讨论】:

    标签: bash shell solaris


    【解决方案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 会返回多行,所以它可以工作。

    【讨论】:

      猜你喜欢
      • 2010-10-10
      • 1970-01-01
      • 2016-06-18
      • 2011-12-19
      相关资源
      最近更新 更多