Как правильно читать stdin внутри скобок, назначенных 2-му каналу?

Как правильно читать stdin внутри скобок, назначенных 2-му каналу?

1-й стиль, группа 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/"

2-й стиль, назначать только во 2-м канале, это не работает:

$ 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

Связанный контент