컬을 jq로 파이핑하는 이 명령에 어떤 문제가 있나요?

컬을 jq로 파이핑하는 이 명령에 어떤 문제가 있나요?

관련이 있는 경우 BSD용으로 작성된 bash 스크립트를 Linux에서 실행하려고 합니다. 이제 나는 다음 줄에 걸려 넘어졌습니다.

json="$(sudo -u "${vpnUser}" -- curl --interface "${adaptorName}" --get --insecure --silent --show-error --fail --location --max-time "${curlMaxTime}" --data-urlencode "token=${authToken}" "https://${gatewayAddress}:19999/getSignature" | jq -Mre)"

스크립트의 변수 값을 에코했는데 괜찮아 보입니다. 그런 다음 변수를 값으로 바꿨습니다. 그런 다음 jq는 구문 오류(일반 출력)에 대해 불평하는 것 같고 Usage:, 내 생각에는 컬이 (23) Failed writing body. 명령을 실행하면 sudo -u ... | jq -MreJSON 파일처럼 보이는 내용이 인쇄됩니다.

답변1

문제는 jq1.6 이전 버전에서는필터달리기. 가장 간단한 필터는 입력과 동일한 출력을 생성하는 ID 필터입니다. 이는 에서 단일 지점으로 작성됩니다 jq.

코드를 작동시키려면:

json=$( ... | jq -r -e . )

함께 사용할 옵션은 다음과 같습니다 jq.

  • 이 옵션은 무색 출력이 요청된다는 점을 제외하면 -M와 동일합니다 . --monochrome-output이는 jq터미널에 쓰지 않을 때의 기본값이므로 이 옵션은 제거될 가능성이 높습니다.

  • -r옵션은 와 동일합니다 --raw-output. jq출력 시맨줄(문자열을 포함하는 JSON 구조가 아님) 문자열이 디코딩됩니다. 이는 출력 문자열이 인용되지 않고 , 확장 과 \n같은 특수 문자 시퀀스를 포함함을 의미합니다 . 이 옵션은\t\"아니요입력이 jq디코딩해야 하는 JSON 인코딩 문자열 세트인 경우 이는 제거됩니다.

  • -e옵션은 과 동일합니다 --exit-status. 이 옵션을 사용하면 jq종료의 종료 상태가 마지막으로 평가된 값을 반영하게 됩니다. 이는 명령이 다음과 같이 종료됨을 의미합니다.실패하다최종 결과가 null또는 false. 셸 옵션이 활성화된 상태에서 스크립트가 errexit실행되면 여기서 0이 아닌 종료 상태로 인해 jq스크립트가 종료됩니다. 즉, 명령이 발생하는 스크립트에 대해 더 자세히 알지 못하면 이 옵션을 제거할 수 없습니다.

jq나는 여기서 사용이 단지 curl결과를 예쁘게 인쇄하는 것이라고 생각합니다 . 원 작성자가 실제로 생각하지 않고 어딘가에서 이 세 가지 옵션을 복사했을 가능성이 있지만(포함된 항목에서 이를 알 수 있음 ) 스크립트를 종료하기 -M위해 종료 상태에 의존했을 수도 있습니다 .jq

답변2

그것은 중요하지 않습니다! 아이리시 커피 한 잔과 jq몇 가지 연구를 마친 후, 저자가 기본적으로 더 읽기 쉬운 여러 줄 출력으로 형식화하는 것 외에는 데이터에 대해 아무 작업도 수행하지 않는 파서를 통해 출력을 파이프하는 이유가 궁금합니다. help 다음의 모든 내용을 삭제하세요 |.

관련 정보