
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