Sim.
$ spamegg
spamegg: command not found
$ echo $?
127
Você poderia apenas fazer:
if software --version &>/dev/null; then
## True, do something
else
## False, do something
fi
Estou escrevendo um script para automatizar a configuração do software. Quero começar verificando se o script precisa primeiro instalar o software e, em seguida, configurá-lo. Se eu tivesse que verificar $ software --version
e eu recebesse bash: command: command not found
, então eu sei que eu iria querer instalá-lo primeiro.
O bash: command: command not found
retorna falso?
Edit: Para quaisquer respostas, a resposta poderia ser explicada?
# example you need wget and your PATH is okay then:
# bash/ksh/.. will return exit code 127 if command not found
#
# redirect stdin and stderr to the /dev/null = if exist,
# output is not interesting
wget --help >/dev/null 2>&1
stat=$? # variable ? include last command exit status
echo "exit status:$stat"
if ((stat == 127 )) ; then # not exist/found
echo "install wget"
exit 1
fi
echo "wget exist, continue"
Você pode usar também se antes do comando, mas que lidar com todos os códigos de saída que não são 0.
Você pode fazer qualquer comando e testar o código de saída usando
# if command ; then # works fine # else # not so fine # fi
# negative testing ! = if not exit code 0 then
if ! wget --help >/dev/null 2>&1 ; then
# give err msg to the stderr and exit
echo "install wget / wget didn't work correctly" >&2
exit 1
fi
echo "wget works fine"
Antes de testar com if, procure primeiro o código de saída de trabalho
wget --help echo $? # will echo 0 = ok. not 0 is not ok # if command return not 0, then you can't test using if, you need # test using exit value = 127
Se a sua intenção é verificar se um comando específico está disponível, você deve fazê-lo em vez de tentar executá-lo:
if command -v spamegg >/dev/null; then
echo spamegg is available
else
apt-get install spamegg
fi
Tentar executar spamegg
para ver se está disponível é uma má abordagem. Primeiro, ofusca seu código, fazendo com que pareça que spamegg
é usado para instalar algo. Segundo (e mais importante), o comando que você está verificando pode existir, mas simplesmente falha por algum motivo:
if grep >/dev/null 2>&1; then
echo grep is available
else
echo grep is not available
fi
Isso gerará grep is not available
mesmo quando for.
IMHO, não acho que sua abordagem seja a melhor maneira de resolver esse problema. O motivo é que apenas porque um comando retorna não encontrado , não significa que o programa não esteja instalado . Pode simplesmente indicar que o programa não está localizado em nenhum dos seus locais PATH.
Talvez, uma maneira melhor seria verificar a lista de pacotes instalados:
RHEL / CentOS:
grep PROGRAM_NAME <(rpm -qa --qf "%{NAME}\n")
Debian / Ubuntu:
grep PROGRAM_NAME <(dpkg --get-selections | awk '{ print $1}')