두 번째 파이프의 괄호 할당 내에서 stdin을 읽는 올바른 방법은 무엇입니까?

두 번째 파이프의 괄호 할당 내에서 stdin을 읽는 올바른 방법은 무엇입니까?

첫 번째 스타일, 할당할 그룹 2 파이프는 다음과 같이 작동합니다.

$ myresult1=$(curl -L 'https://archive.org/wayback/available?url=stackoverflow.com' 2>/dev/null | jq '.archived_snapshots.closest.url'); echo "$myresult1"
"http://web.archive.org/web/20160622184546/http://stackoverflow.com/"

두 번째 스타일, 두 번째 파이프에만 할당하면 작동하지 않습니다.

$ curl -L 'https://archive.org/wayback/available?url=stackoverflow.com' 2>/dev/null | myresult2=$(jq '.archived_snapshots.closest.url'); echo "$myresult2"

$ 

그래서 두 번째 스타일을 작동시키는 것이 가능한지, 즉 괄호 할당 내에서 stdin을 읽을 수 있는지 궁금합니다.

답변1

두 번째 명령은 작동합니다. 문제는 사용 중인 bash쉘이나 모든 파이프라인 구성 요소를 하위 쉘에 배치하는 쉘입니다. myresult2올바르게 설정되었지만 다음과 같이 동일한 하위 셸에 머무르지 않는 한 변수는 즉시 범위를 벗어납니다.

curl -L 'https://archive.org/wayback/available?url=stackoverflow.com' \
     2>/dev/null | {
     myresult2=$(jq '.archived_snapshots.closest.url'); echo "$myresult2" ; }

에서 이 명령을 실행하면 ksh변수 할당이 최상위 셸에서 수행되므로 예상대로 작동합니다.

ksh또는 다음에서 동작을 가져오도록 lastpipe 옵션을 설정할 수도 있습니다 bash.

shopt -s lastpipe

대화형 세션에서 이 작업을 수행하려면 작업 제어도 비활성화해야 합니다.

set +m

관련 정보