Capturando o status de saída dos comandos
A atribuição da saída do comando à variável rep
não perde o status de saída do comando curl; ainda está disponível como $?
. Para obter mais detalhes, consulte Como posso armazenar o valor de retorno e / ou a saída de um comando em uma variável? .
Curl código de saída para solicitações HTTP com falha
Normalmente, se um recurso HTTP solicitado não estiver disponível, um servidor da Web responderá com um documento HTML correspondente ao código de status HTTP relevante, por exemplo, 404. Nesses casos, o curl aceita esse documento do servidor e, como conseguiu obter uma resposta do servidor da Web, exibe o documento de erro e sai com um status 0 para obter êxito.
Suponho que você esteja esperando que curl
retorne um código de erro se houver um problema ao recuperar o recurso HTTP. Nos scripts, é melhor ter curl
sair com status mal-sucedido se houver um problema ao recuperar o recurso HTTP. Para isso, você precisa fornecer a opção -f, --fail
para curl. A partir da página do manual curl:
Fail silently (no output at all) on server errors. This is mostly done to better enable scripts etc to better deal with failed attempts. In normal cases when an HTTP server fails to deliver a document, it returns an HTML document stating so (which often also describes why and more). This flag will prevent curl from outputting that and return error 22.
This method is not fail-safe and there are occasions where non-successful response codes will slip through, especially when authentication is involved (response codes 401 and 407).
Você pode salvar o status de saída do comando curl usando uma variável extra, status
:
httpUrl="http://www.nnin.com"
rep=$(curl -v -X POST -d "UID=username&PWD=pass" "$httpUrl")
status=$?
echo "$rep"
exit $status
A variável do shell, $httpUrl
, deve conter aspas duplas, caso a URL contenha caracteres que possam ser interpretados pelo shell.
(não) imprimindo a saída do comando curl
Não há necessidade de salvar a saída do comando curl na variável rep
se tudo o que você fizer com ela for imprimi-la na saída padrão.
Em relação à segunda pergunta, "como evitar a saída da impressão" , você pode substituir a opção -v/--verbose
pela opção -s/--silent
(modo silencioso. Não mostrar medidor de progresso ou mensagens de erro) .
Na verdade, você pode simplificar ainda mais seu script se o último comando for a chamada de curl. O código de saída do script será o código de retorno do último comando do script.
httpUrl="http://www.nnin.com"
curl -s -X POST -d "UID=username&PWD=pass" "$httpUrl"