Estou tentando retornar um código de saÃda 0 se um comando sair com o código 143 (timeout, do "comando timeout"), 1 caso contrário. Devido a restrição externa (script CI), tenho que iniciar o comando e fazer a verificação na cláusula if.
Aqui está o que eu uso atualmente:
if timeout -t 10 *command* || [ $? = 143 ]
then exit 0
else exit 1
fi
No momento, sempre sai com um código 0.
Seu script não está fazendo o que você deseja porque, quando tem um status de saÃda 0 - que é o status de saÃda considerado verdadeiro no shell script - o comando apenas é concluÃdo com um status de saÃda 0 e não causa o erro lado a ser executado. Da mesma forma, se você substituÃsse por , qualquer status de saÃda diferente de zero do lado esquerdo seria o status de saÃda de todo o comando e o lado direito não seria executado.
timeout -t 10 command
timeout -t 10 command || [ $? = 143 ]
||
||
&&
Você deve apenas executá-los como dois comandos separados , separando-os com um
;
ou uma nova linha. Se necessário, você ainda pode usar ambos comoif
condição ao fazer isso (veja abaixo).Estou assumindo que é o status de saÃda de , e não (se diferente), que você precisa. Caso contrário, não está claro para mim o que você deseja; como ilkkachu , não estou familiarizado com um comando que aceita uma opção. Normalmente, eu sugeriria que você fizesse dessa maneira, exceto que parece que sua "restrição externa" pode proibi-lo, já que não usa nada:
timeout -t 10 command
command
timeout
-t
if
O comando
test
/[
retorna um código de saÃda de 0 para indicar verdadeiro e 1 para indicar falso, e é por isso que você não precisa escrever ramificações separadas comexit 0
eexit 1
. Oexit
builtin, quando executado sem argumentos, faz com que o shell retorne o status de saÃda do último comando executado.Se você já estiver no final do script, poderá omitir
exit
, porque quando o controle flui do final de um script, ele tem o mesmo efeito queexit
:(Em ambos os casos, você pode escrever
[ "$?" -eq 143 ]
em vez detest "$?" -eq 143
, se quiser. Veja abaixo os detalhes sobre[
/test
uso.)Embora sua descrição pareça que você não pode usar esse código exatamente, você deve, no entanto, ser capaz de modificá-lo para assumir a forma necessária. Você disse que não deve apenas fazer a verificação, mas também iniciar o comando na
if
cláusula. Isso parece proibir a abordagem legÃvel e idiomática sugerida por Hauke ​​Laging de executar o comando antes do arquivoif
.Portanto, se você não puder fazer isso, poderá incluir o comando na
if
condição como estava fazendo, mas separe-o do seu comandotest
/ com um em vez de um :[
;
||
(Você pode omitir
"
"
cerca de$?
. Você também pode escrever=
em vez de143
, embora seja confuso porque=
significa comparação textual em vez de numérica. Você pode escrevertest "$?" -eq 143
em vez de[ "$?" -eq 143 ]
, se quiser.)A razão pela qual isso funciona é que você tem permissão para escrever uma
if
condição que consiste em vários comandos separados por ponto-e-vÃrgula ou até mesmo novas linhas. É por isso que a gramática do shell exige que você escrevathen
para indicar o fim daif
condição. Portanto, você não precisa tentar o uso tortuoso do operador&&
or||
quando seu objetivo é executar dois comandos como umaif
condição enquanto faz comif
que ele próprio teste apenas o segundo.Observe que só estou sugerindo isso porque você disse que tudo deveria estar na
if
condição. Eu não recomendo scripts assim quando você não precisa.