Проверьте, существует ли программа в 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