Em zsh
echo 'a string' > test.txt
echo $?
0
e
[[ $(echo 'a string') ]]
echo $?
0
enquanto
[[ $(echo 'a string' > test.txt) ]]
echo $?
1
outro exemplo
curl -so 'curl-8.2.1.tar.gz' https://curl.se/download/curl-8.2.1.tar.gz
echo $?
0
ou
[[ $(curl -so 'curl-8.2.1.tar.gz' https://curl.se/download/curl-8.2.1.tar.gz) ]]
echo $?
1
Minhas perguntas:
- Isso é por causa do redirecionamento de saída? Se não, o que está causando isso?
- Os comandos são executados com sucesso:
a string
aparecetest.txt
e curl baixa o arquivo para o arquivo de saída que especifiquei, por que a avaliação resulta emfalse
? - Existe uma maneira sensata de lidar com isso em scripts? Digamos que eu queira executar algum comando se o anterior foi executado com sucesso (mas
false
ainda retornou), como devo proceder? Eu poderia adicionar uma segunda verificação para ver se a linha apareceu ou se o arquivo foi baixado, mas a avaliação da execução bem-sucedida do comando não seria necessária em primeiro lugar.
Mais alguns exemplos de integridade (legibilidade vs. "correção"?):
if ( $(echo 'a string' > text.txt) ); then echo yes; else echo no;fi
yes
if (( $(echo 'a string' > text.txt) )); then echo yes; else echo no;fi
no
if $(echo 'a string' > text.txt); then echo yes; else echo no;fi
yes
if echo 'a string' > text.txt; then echo yes; else echo no;fi
yes
$?
Na seção PARAMETERS SET BY THE SHELL
zshparam
de man , ouinfo zsh 'Parameters Set By The Shell'
você verá isso,$?
está o status de saída retornado pelo último comando.$(...)
No homem
zshexpn
ouinfo zsh 'Command Substitution'
você verá:Assim, por exemplo, a expressão
$(echo 'a string')
seria substituída pela saída deste comando (a string<newline>
) sem os caracteres de nova linha finais, o que fornecea string
. Mas o comando interno$(echo 'a string' > test.txt)
não produziria saída para a saída padrão, então o resultado dessa expressão é uma string vazia.[[ ... ]]
Na página de manual de
zshmisc
ouinfo zsh 'Conditional Expressions'
, você verá:[...]
E agora para seus exemplos
Portanto, na linha a seguir, a saída do comando dentro de
$( ... )
é a stringa string<newline>
e a expansão de$(...)
si seráa string
, portanto, , que é uma string de comprimento diferente de zero, portanto a[[ ... ]]
avaliação retornará verdadeiro (status de saída 0).Mas no comando a seguir, como você tem um redirecionamento, a expansão de
$( ... )
será uma string de comprimento zero e a[[ ... ]]
avaliação retornará falso (status de saída 1, sendo um número diferente de 0).Da mesma forma, o status de saída do comando a seguir é o status de saída do
curl
comando.E a página de manual
curl
indicará em que condições ele retornará um status de saída diferente de zero (falha).Mas no próximo exemplo, o status de saída dependeria se o
curl
comando teve alguma saída (sucesso) ou não teve nenhuma saída (falha).Vou parar por aqui, mas você pode continuar lendo o manual, por exemplo o significado de
(( ... ))
na seção AVALIAÇÃO ARITMÉTICA de manzshmisc
(ouinfo zsh 'Arithmetic Evaluation'
)Concluo disso que using
[[ ... ]]
não é adequado para avaliar a execução bem-sucedida do comando, a menos que a execução bem-sucedida do comando seja entendida de forma que a saída do comando resulte em uma sequência diferente de zero. Para fins de verificação em scripts zsh, o caminho certo seriaif command; then ...; [else ...;] fi
conforme indicado no comentário de muru)$?
posteriormente, e/ou