두 번째 파이프에 대한 대괄호 할당 내에서 표준 입력을 읽는 올바른 방법은 무엇입니까

두 번째 파이프에 대한 대괄호 할당 내에서 표준 입력을 읽는 올바른 방법은 무엇입니까

첫 번째 스타일, 할당할 두 번째 파이프 세트는 다음과 같이 작동합니다.

$ 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변수 할당이 최상위 셸에서 수행되므로 예상대로 작동합니다.

또는 lastpipe 옵션을 설정하여 ksh다음 동작을 얻을 수 있습니다 bash.

shopt -s lastpipe

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

set +m

관련 정보