Проверьте, существует ли программа в bash

Я пытаюсь проверить, существует ли md5sum или дайджест на Solaris, а script используется на разных машинах.

Вот функция в sh script, которая вызывается из ksh script

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

Однако, когда я печатаю его в терминале, он работает как exptected

Любые идеи? Благодаря

Ответ 1

Скорее всего, вы используете ksh или, возможно, Bash для вашей интерактивной оболочки. Оба параметра имеют -p для type. Оболочка (возможно sh), в которой работает ваш script, имеет type, но не имеет опции -p, поэтому она ищет "-p" в качестве имени исполняемого файла и не находит он.

Итак, вы можете изменить свой script на использование ksh, или вы можете использовать программу which. Последнее, вероятно, более переносимо, поскольку в некоторых системах нет ksh.

Ответ 2

Как вы устанавливаете 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

Ответ 3

Вы пробовали следующий синтаксис:

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 вернет несколько строк, поэтому он работает.

Ответ 4

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