heredoc과 파이프 결합 실패

heredoc과 파이프 결합 실패

컬을 사용하여 API에 로그인하려고 합니다. 요청에는 JSON이 필요하므로 다음을 사용합니다.

curl -s -X POST -H "Content-Type: application/json" \
    $API_URL/auth -d@- <<EOF
{
  "id": "[email protected]",
  "password": "!password!"
}
EOF

...그리고 잘 작동하고 있어요. 나는 다음과 같은 결과를 얻습니다.

{"access_token":"jXed...I5mQ=","expires_in":3600}

하지만 변수에서 출력을 캡처하려고 하면 작동하지 않습니다.

난 노력 했어:

x=$(curl ...)

...하지만 그건 실패bash: !password!: event not found

응, 내 비밀번호야하다!; 로 시작하다 이것은 API의 테스트 설치이므로 취약한 비밀번호를 사용하고 있습니다.

를 사용하거나 set +H스크립트에서 이것을 실행하면 bash는 !. 내 문제는 다음과 같습니다

  1. 가끔 스크립트를 명령줄에 복사하여 붙여넣고 싶을 때가 있습니다. 6개월이 지나면 나는 이 주름을 잊어버릴 것이다.
  2. 왜 bash는 heredoc 내에서 이 작업을 시도합니까?

앞서 언급한 의 이상함 때문에 대신 !결과를 다음과 같이 파이핑해 보았습니다 read.

(curl ...
EOF
) | read x

...그러나 어떻게든 heredoc가 엉망이 되고 서버는 "잘못된 JSON"에 해당하는 응답을 합니다.

cat대신 사용하면 curlheredoc이 비어 있는 것처럼 보입니다.

답변1

오류를 방지하려면 스크립트를 포함하여 event not found을 사용하세요 . set +H이는 무해하며 이를 설명하는 설명을 추가할 수 있습니다.

| read x단순히 작동하지 않습니다. 보다http://tiswww.case.edu/php/chet/bash/FAQ, 구체적으로:

E4) 명령의 출력을 '변수 읽기'로 파이프하면 읽기 명령이 완료될 때 $variable에 출력이 표시되지 않는 이유는 무엇입니까?

Bash에서는 하위 쉘에서 | foo실행됩니다 . foo상위 셸에서는 변수를 변경할 수 없습니다.

대신 사용하세요 x=$(whatever) .

관련 정보