첫 번째 스타일, 할당할 두 번째 파이프 세트는 다음과 같이 작동합니다.
$ 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