Código de retorno para ondulação usado em uma substituição de comando

5

Eu tenho script como abaixo: - (editado)

httpUrl="http://www.nnin.com"
rep=$(curl -v -X POST -d "UID=username&PWD=pass" $httpUrl)

status=$? 

if [ "$?" -eq 0 ]; then

    echo "Success"
    exit $status
  else
    echo "Failed"
    exit $status
fi

quando executo o script, o código de retorno é sempre $?=0 porque, de certo modo, o script é executado com êxito, mas eu quero que o código de retorno de cURL seja aplicado na próxima função.

Eu tentei navegar e usar vários métodos neste site particularmente, mas não ajuda muito, talvez por causa do comando POST e como evitar que a saída seja impressa quando eu executar o script?

Obrigado

    
por Asif 21.05.2015 / 10:02

1 resposta

15

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"
    
por 21.05.2015 / 11:51