LINUX.ORG.RU

Bash fallback, если нет утилиты

 ,


0

2

Как наиболее переносимым образом проверить, установлена ли нужная утилита?

Ну то есть:

Md5Calc()
{
    # Minix : md5 -n $1
    md5sum $1
}
Мне нужно, в случае, если md5sum нет в системе вызвать второй вариант. Сам скрипт выполняется с set -e, так что просто вызвать два варианта не выйдет.

P.S. Вопрос на засыпку, реально ли похожий fallback устроить в шебанге? /bin/bash vs /usr/pkg/bin/bash

★★★★★

поставить два screen ?

anonymous
()

Стандартный приём - это опросить which или where:

which md5sum >/dev/null && echo found || echo missing

Для шебанга есть тоже стандартная рекомендация использовать #!/usr/bin/env bash, но это не fallback и придётся колдовать с .profile в случае нестандартного расположения кастомных утилит.

E ★★★
()
# ./PPP328.sh ./PPP328.sh 
./PPP328.sh: строка 5: md5sem: команда не найдена
d843971a89d8672eae0424daecb1add2  ./PPP328.sh
# cat ./PPP328.sh
#!/bin/sh

set -e

md5sem "$1" || md5sum "$1"

legolegs ★★★★★
()
Ответ на: комментарий от E

Как минимум в bash можно ещё использовать command -v cmdname. Это встроенная команда и она также находит другие встроенные команды.

xaizek ★★★★★
()

Как наиболее переносимым образом проверить, установлена ли нужная утилита?

command -v

d_a ★★★★★
()

Сам скрипт выполняется с set -e

Зря.

в случае, если md5sum нет в системе вызвать второй вариант
Вопрос на засыпку, реально ли похожий fallback устроить в шебанге? /bin/bash vs /usr/pkg/bin/bash

#!/bin/sh

if [ -z "$_PROPER_SHELL_RUNNING" ]; then
    if [ -x /usr/pkg/bin/bash ]; then
        interpreter=/usr/pkg/bin/bash
    elif [ -x /bin/bash ]; then
        interpreter=/bin/bash
    else
        echo >&2 'GNU Bash not found'
        exit 1
    fi
    export _PROPER_SHELL_RUNNING=1
    exec "$interpreter" "$0" "$@"
fi

#!bash

shopt -s expand_aliases

message ()
{
    printf >&2 '%s\n' "$*"
}

commandp ()
{
    command -v >&- "$@"
}

alias-find ()
{
    local var="$1"
    shift
    for cmd; do
        commandp $cmd && {
            alias $var="$cmd"
            return 0
        }
    done
    message $"${var}: unmet dependency"
    exit 33
}

alias-find MD5SUM \
           md5sum 'md5 -n'

MD5SUM --version

Ну или как-то так.

Zmicier ★★★★★
()
Ответ на: комментарий от PPP328

Сразу скажет sh - нет такого файла или каталога

Тогда, во-первых, зачем вы задали этот вопрос, если заранее знаете, что он нерешаем?

А во-вторых, позвольте удовлетворить любопытство, что это за сумасшедшая система такая, где /bin/sh нету. Даже в GuixSD вопреки всему он есть.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Пардон, я ошибся. sh есть, bash нет. Вы правы.

PPP328 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.