O “bash: command: command not found” retorna falso?

1

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?

    
por N Altun 13.01.2016 / 05:27

4 respostas

8

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
    
por 13.01.2016 / 05:30
1

# 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
    
por 13.01.2016 / 06:49
1

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.

    
por 13.01.2016 / 09:16
1

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}')
    
por 13.01.2016 / 09:14

Tags