명령 대체에 사용된 컬의 반환 코드

명령 대체에 사용된 컬의 반환 코드

내 스크립트는 다음과 같습니다.-(편집됨)

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

스크립트를 실행할 때 반환 코드는 항상 $?=0어느 시점에서 스크립트가 성공적으로 실행되었지만 반환 코드가 cURL다음 함수에 적용되기를 원하기 때문입니다.

특히 이 사이트에서 여러 가지 방법을 탐색하고 사용해 보았지만 그다지 도움이 되지 않았습니다. 아마도 명령 때문일 수도 있고 POST스크립트를 실행하는 동안 인쇄를 방지하려면 어떻게 해야 합니까?

감사해요

답변1

명령의 종료 상태 캡처

명령 출력을 rep변수에 할당해도 컬 명령의 종료 상태가 손실되지 않습니다. $?자세한 내용은 을 참조하세요.명령의 반환 값 및/또는 출력을 변수에 어떻게 저장할 수 있나요?.

실패한 HTTP 요청에 대한 Curl 종료 코드

일반적으로 요청된 HTTP 리소스를 사용할 수 없는 경우 웹 서버는 관련 HTTP 상태 코드(예: 404)에 해당하는 HTML 문서로 응답합니다. 이 경우, 컬은 서버로부터 문서를 받아들이고 웹 서버로부터 성공적으로 응답을 받았기 때문에 오류 문서를 표시하고 성공을 나타내기 위해 상태 0으로 종료됩니다.

curlHTTP 리소스를 검색하는 데 문제가 있는 경우 오류 코드를 반환하고 싶은 것 같습니다. 스크립트에서 curlHTTP 리소스를 검색하는 데 문제가 있는 경우 실패 상태로 종료하는 것이 가장 좋습니다. 이렇게 하려면 -f, --fail컬 매뉴얼 페이지에 다음과 같이 설명된 컬 옵션을 제공해야 합니다.

서버 오류가 발생하면 자동으로 실패합니다(출력 없음). 이는 실패한 시도를 더 잘 처리하기 위해 스크립트 등을 더 잘 활성화하기 위해 주로 수행됩니다. 일반적인 상황에서 HTTP 서버가 문서를 전달할 수 없으면 상황을 설명하는 HTML 문서를 반환합니다(일반적으로 이유와 추가 정보도 설명). 이 플래그는 컬이 이 내용을 출력하지 못하게 하고 오류 22를 반환합니다.

이 방법은 안전하지 않으며 특히 인증이 관련된 경우 실패한 응답 코드(응답 코드 401 및 407)를 놓치는 경우가 있습니다.

추가 변수를 사용하여 컬 명령의 종료 상태를 저장할 수 있습니다 status.

httpUrl="http://www.nnin.com"
rep=$(curl -f -v -d "UID=username&PWD=pass" "$httpUrl")
status="$?"
echo "$rep"
exit "$status"

URL에 셸에서 해석할 수 있는 문자가 포함되어 있는 경우 셸 변수를 httpUrl큰따옴표로 묶어야 합니다. 또한 -X POST옵션을 사용하여 데이터를 제공할 때 항상 POST 메서드가 사용되므로 이는 필요하지 않습니다 -d.

(하지 않음) 컬 명령의 출력을 인쇄하지 않습니다.

rep컬 명령의 출력을 표준 출력으로 인쇄하는 것이 전부라면 변수에 저장할 필요가 없습니다.

두 번째 질문에 관해서는,"인쇄물 방지 방법", 옵션을 옵션 -v/--verbose으로 바꿀 수 있습니다-s/--silent(자동 모드. 진행률 표시기 또는 오류 메시지가 표시되지 않음).

실제로 스크립트의 마지막 명령이 컬 호출인 경우 스크립트를 더욱 단순화할 수 있습니다. 스크립트의 종료 코드는 스크립트의 마지막 명령의 반환 코드가 됩니다.

httpUrl="http://www.nnin.com"
curl -f -s -d "UID=username&PWD=pass" "$httpUrl"

관련 정보