Eu tenho um script (bash) que gostaria de rodar em dois computadores diferentes, um é o OpenBSD com o programa sha256
, o outro é o Ubuntu com sha256sum
. Qual é a melhor / prática padrão para permitir que o script manipule os dois casos?
Observe que, para sha256
vs sha256sum
, as outras opções do programa não precisariam ser alteradas, mas para uma escolha diferente de programas, como wget
vs. curl
, os outros parâmetros mudaria também (por exemplo, wget
vs. curl -O
). Portanto, a melhor resposta permitiria diferentes parâmetros de linha de comando, dependendo do programa disponível.
Uma maneira de corrigir o programa é usar uma variável que muda dependendo do status de saída de command
, hash
ou type
, conforme essa SO pergunta
por exemplo,
SHA_PROGRAM=sha256
command -v "$SHA_PROGRAM"
# If the exit status of command is nonzero, try something else
if [ "$?" -ne "0" ]; then
command -v "sha256sum"
if [ "$?" -ne "0" ]; then
printf "This program requires a sha256 hashing program, please install one\n" 1>&2
exit 1
else
SHA_PROGRAM=sha256sum
fi
fi
$SHA_PROGRAM $MYFILE
Mas, assim, parece um pouco detalhado para mim, para não mencionar o problema da declaração if aninhada.
Poderia ser generalizado um pouco usando uma matriz de comandos possíveis:
declare -a POSSIBLE_COMMANDS=("sha256" "sha256sum")
SHA_PROGRAM=""
for $OPT in "${POSSIBLE_COMMANDS[@]}"
do
command -v "$OPT"
# if the exit status of command is zero, set the command variable and exit the loop
if [ "$?" -eq "0" ]; then
SHA_PROGRAM=$OPT
break
fi
done
# if the variable is still empty, exit with an error
if [ -z "$SHA_PROGRAM" ]; then
printf "This program requires a sha256 program. Aborting\n" 1>&2
exit 1
fi
$SHA_PROGRAM $MY_FILE
Essa maneira também funcionaria, eu acredito, mas espero obter conselhos de um programador mais experiente e melhor, caso eu esteja perdendo alguma solução melhor (talvez um uso inteligente do operador ||
?).