2010-04-09 87 views
2

我正在尝试检查solaris上是否存在md5sum或摘要,并在不同的机器上使用脚本。检查bash中是否存在程序

这里是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 

然而,当我在一个终端上键入它,工作原理查出

任何想法? 感谢

回答

2

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

所以你可以改变你的脚本使用ksh或者你可以使用which程序。后者可能更便携,因为某些系统没有ksh

+0

我不敢相信我能得到多么天真,甚至从来没有想过这一点。 感谢您对此有所了解。我现在将脚本转换为bash,我的代码工作 – rojanu 2010-04-12 10:23:54

+0

哦,我将脚本转换为bash并最终使用了您的建议 – rojanu 2010-05-27 12:41:19

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将返回多行,所以它的工作原理。

+0

在bash这只能 – rojanu 2010-04-12 10:19:28

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 
+0

第一个条件的计算结果为真实的,即使强硬没有的md5sum机器 – rojanu 2010-04-12 10:21:55

+0

上,我认为其中的原因是“它”总是在Solaris上,输出时命令未找到回应是 “no md5sum in/usr/bin/vol2/bin” – rojanu 2010-04-12 10:43:51

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 
+0

我对精确路径不感兴趣。该脚本位于用户home/bin上,并且取决于用户登录的计算机,我不想知道系统上存在哪些命令。 – rojanu 2010-05-27 12:37:45