Como verificar se um comando foi bem sucedido?

142

Existe alguma maneira de verificar se há um erro na execução de um comando?

Exemplo:

test1='sed -i "/:@/c connection.url=jdbc:oracle:thin:@$ip:1521:$dataBase" $search'
valid $test1

function valid () {
  if $test -eq 1; then
    echo "OK"
    else echo "ERROR" 
  fi
}

Eu já tentei fazer isso, mas parece que não está funcionando. Eu não sei como fazer isso.

    
por moata_u 07.03.2011 / 12:40

7 respostas

215

O valor de retorno é armazenado em $? . 0 indica sucesso, outros indica erro.

some_command
if [ $? -eq 0 ]; then
    echo OK
else
    echo FAIL
fi

Como qualquer outro valor textual, você pode armazená-lo em uma variável para comparação futura:

some_command
retval=$?
do_something $retval
if [ $retval -ne 0 ]; then
    echo "Return code was not zero but $retval"
fi

Para possíveis operadores de comparação, consulte man test .

    
por Lekensteyn 07.03.2011 / 13:06
58

Se você só precisa saber se o comando foi bem-sucedido ou não, não se incomode em testar $? , apenas teste o comando diretamente. Por exemplo:

if some_command; then
    printf 'some_command succeeded\n'
else
    printf 'some_command failed\n'
fi

E atribuir a saída a uma variável não altera o valor de retorno (bem, a menos que ela se comporte de forma diferente quando a saída padrão não for um terminal, é claro).

if output=$(some_command); then
    printf 'some_command succeded, the output was «%s»\n' "$output"
fi
O

link explica if em mais detalhes.

    
por geirha 09.03.2011 / 00:54
16
command && echo OK || echo Failed
    
por Abraham Sanchez 01.12.2014 / 22:19
10

$? deve conter o status de saída do comando anterior, que deve ser zero para nenhum erro.

Então, algo como:

cd /nonexistant
if [ $? -ne 0 ]
then
    echo failed
else
    echo success!
fi

na maioria dos casos, é mais fácil usar o & amp; & amp; Construir para encadear comandos que precisam depender um do outro. Portanto, cd /nonexistant && echo success! não ecoaria o sucesso porque o comando é interrompido antes de & amp; & amp; O corolário disso é ||, onde cd /nonexistant || echo fail falharia porque cd falhou. (isso se torna útil se você usar algo como || exit, que finalizará o script se o comando anterior falhar).

    
por Shaun 07.03.2011 / 13:04
3
command && echo $? || echo $?
    
por modrobert 12.08.2016 / 18:01
1

Para a verificação de erros , seus comandos:

execute [INVOKING-FUNCTION] [COMMAND]
execute () {
    error=$( 2>&1 >/dev/null)

    if [ $? -ne 0 ]; then
        echo ": $error"
        exit 1
    fi
}

Inspirado na manufatura enxuta:

por Alberto Salvia Novella 29.12.2017 / 05:20
0

Deve-se observar que o tipo de abordagem if...then...fi e && / || lida com o status de saída retornado pelo comando que queremos testar (0 no sucesso); no entanto, alguns comandos não retornam um status de saída diferente de zero se o comando falhar ou não puder lidar com a entrada. Isso significa que as abordagens usuais if e && / || não funcionarão para esses comandos específicos.

Por exemplo, no Linux GNU file ainda sai com 0 se recebeu um arquivo não existente como argumento e find não conseguiu localizar o usuário do arquivo especificado.

$ find . -name "not_existing_file"                                          
$ echo $?
0
$ file ./not_existing_file                                                  
./not_existing_file: cannot open './not_existing_file' (No such file or directory)
$ echo $?
0

Nesses casos, uma maneira potencial de lidarmos com a situação é lendo stderr / stdin messages, por exemplo, aqueles que retornaram pelo comando file ou analisam a saída do comando como em find . Para esse propósito, case declaração poderia ser usada.

$ file ./doesntexist  | while IFS= read -r output; do                                                                                                                  
> case "$output" in 
> *"No such file or directory"*) printf "%s\n" "This will show up if failed";;
> *) printf "%s\n" "This will show up if succeeded" ;;
> esac
> done
This will show up if failed

$ find . -name "doesn'texist" | if ! read IFS= out; then echo "File not found"; fi                                                                                     
File not found

(Este é um repost da minha própria resposta em questão relacionada em unix.stackexchange.com )

    
por Sergiy Kolodyazhnyy 13.11.2017 / 19:58