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 faço como isso.
command-line
moata_u
fonte
fonte
valid
) antes de chamá-la.Respostas:
O valor de retorno é armazenado em
$?
. 0 indica sucesso, outros indica erro.Como qualquer outro valor textual, você pode armazená-lo em uma variável para comparação futura:
Para possíveis operadores de comparação, consulte
man test
.fonte
;
antes deelse
efi
: `if ...; então ...; outro ...; fitest
.[ $? ]
(ou equivalentetest $?
) não funciona porque é$?
avaliado como um número (0, 1 etc.) que não é nulo. Consulte a documentação paratest
: "Se EXPRESSION for omitida, 'test' retornará false. Se EXPRESSION for um argumento único, 'test' retornará false se o argumento for nulo e true caso contrário."Se você só precisa saber se o comando foi bem-sucedido ou falhou, não se preocupe em testar
$?
, basta testar o comando diretamente. Por exemplo:E atribuir a saída a uma variável não altera o valor de retorno (bem, a menos que se comporte de maneira diferente quando stdout não é um terminal, é claro).
http://mywiki.wooledge.org/BashGuide/TestsAndConditionals explica
if
em mais detalhes.fonte
$?
faz, então você está incorreto ao dizer que testar o comando diretamente é estritamente melhor.local
comando, ou seja,local foo=$(false); echo $?;
produz0
na saída. Maslocal
é relevante apenas dentro das funções do bash.fonte
command
retorna erro na tela, como ocultá-lo?command
gravar erros no stderr, você poderá usar o formuláriocommand 2> /dev/null && echo OK || echo Failed
. O2> /dev/null
redireciona a saída stderr para/dev/null
. No entanto, alguns utilitários gravam erros no stdout (mesmo que seja uma prática ruim). Nesse caso, você pode omitir o 2 do redirecionamento, mas você perderá qualquer saída do comando. Esse método de verificação do sucesso é bom para uma lógica ternária simples, mas para um comportamento mais complexo, é melhor verificar o$?
êxito do comando ou usar oif
método de bloco descrito na resposta do @ geirha.$? deve conter o status de saída do comando anterior, que deve ser zero, sem erros.
Então, algo como;
na maioria dos casos, é mais fácil usar a construção && para encadear comandos que precisam depender um do outro. Portanto
cd /nonexistant && echo success!
, não ecoaria sucesso porque o comando quebra antes de &&. O corolário disso é ||, ondecd /nonexistant || echo fail
o eco falharia porque o cd falhou. (isso se torna útil se você usar algo como || exit, que encerrará o script se o comando anterior falhar.)fonte
fonte
command; echo $?
?true && echo $? || echo $?
/true; echo $?
efalse && echo $? || echo $?
/false; echo $?
- você encontrará, eles fazem exatamente a mesma coisa: Dcommand && echo "success: $?" || echo "fail: $?"
Deve-se notar que
if...then...fi
e&&
/||
tipo de abordagem lida com o status de saída retornado pelo comando que queremos testar (0 em caso de 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 usuaisif
e&&
/||
não funcionarão para esses comandos específicos.Por exemplo, no Linux, o GNU
file
ainda sai com 0 se recebeu um arquivo não existente como argumento efind
não conseguiu localizar o usuário especificado.Nesses casos, uma maneira potencial de lidarmos com a situação é lendo
stderr
/stdin
mensagens, por exemplo, aquelas que retornaram porfile
comando ou analisam a saída do comando como emfind
. Para esse propósito, acase
instrução pode ser usada.(Esta é uma nova resposta da minha própria resposta sobre pergunta relacionada em unix.stackexchange.com )
fonte
Como mencionado em muitas outras respostas, um simples teste de
$?
fará, como esteSe você quiser testar se o comando falhou , use uma versão mais curta
bash
(mas talvez exagere) da seguinte maneira:Isso funciona usando o
(( ))
modo aritmético, portanto, se o comando retornousuccess
, ou seja$? = 0
, o teste avalia para((0))
quais testesfalse
, caso contrário, ele retornarátrue
.Para testar o sucesso , você pode usar:
mas já não é muito mais curto que o primeiro exemplo.
fonte
Para evitar erros em seus comandos:
Inspirado na fabricação enxuta:
fonte
if [$ (comando)]; então ecoa "suceder"; fi
fonte
true
consegue,if [ $(true) ]; then echo "succeed"; fi
massucceed
não é impresso. De fato, isso nunca verifica se foicommand
bem-sucedido. Deve apenas usarif command
como no post de geirha .$(
)
é substituição de comando .[
]
é uma expressão condicional . Ausência de divisão de palavras e expansão de nome de arquivo , isso basicamente testa secommand
houve saída.