Seu script não está fazendo o que você deseja porque, quando timeout -t 10 command tem um status de saída igual a 0 - que é o status de saída considerado verdadeiro no shell script - o comando timeout -t 10 command || [ $? = 143 ] é concluído com uma saída status 0 e não faz com que o lado direito de || seja executado. Da mesma forma, se você substituiu || 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 .
Você deve executá-los como dois comandos separados , separando-os com ; ou newline. Se necessário, você ainda pode usá-los como a condição if quando fizer isso (veja abaixo).
Estou assumindo que é o status de saída de timeout -t 10 command , e não command (se diferente), que você precisa. Caso contrário, não está claro para mim o que você quer; como o ilkkachu , não estou familiarizado com um comando timeout que aceita uma opção -t . Normalmente eu sugiro que você faça desta forma, exceto que sua "restrição externa" pode proibi-lo, já que ele não usa if :
timeout -t 10 command
test "$?" -eq 143
exit
O comando test / [ retorna um código de saída 0 para indicar true e 1 para indicar false, e é por isso que você não precisa gravar ramificações separadas com exit 0 e exit 1 . O exit 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 que exit :
timeout -t 10 command
test "$?" -eq 143
(Em ambos os casos, você pode escrever [ "$?" -eq 143 ] em vez de test "$?" -eq 143 , se desejar. Veja abaixo os detalhes sobre [ / test usage.)
Embora sua descrição tenha feito parecer que você não pode usar esse código exatamente, você deve, no entanto, modificá-lo para assumir o formulário necessário. Você disse que não deve apenas fazer o teste, mas também iniciar o comando na cláusula if . Isso parece proibir a abordagem legível e idiomática sugerida por Hauke Laging de executar o comando antes do if .
Se você não puder fazer isso, inclua o comando na condição if como estava, mas separe-o do comando test / [ com ; em vez de um || :
if timeout -t 10 command; [ "$?" -eq 143 ]; then
exit 0
else
exit 1
fi
(Você pode usar omitindo " " em torno de $? . Você também pode escrever = em vez de 143 , embora seja confuso porque = significa texto em vez de numérico Você pode escrever test "$?" -eq 143 em vez de [ "$?" -eq 143 ] se desejar.
A razão pela qual isso funciona é que você tem permissão para escrever uma condição if que consiste em vários comandos separados por ponto-e-vírgula ou até mesmo novas linhas. É por isso que a gramática de shell requer que você escreva then para indicar o final da condição if . Portanto, você não precisa usar o uso circunscrito do operador && ou || quando sua meta é executar dois comandos como uma condição if , ao mesmo tempo em que faz com que if teste apenas o segundo.
Note que estou apenas sugerindo isso porque você disse que tinha que estar na condição if . Eu não recomendo scripts assim quando você não precisa.