Qual é a maneira correta de ler stdin dentro da atribuição de parênteses do segundo tubo

Qual é a maneira correta de ler stdin dentro da atribuição de parênteses do segundo tubo

1º estilo, tubo do grupo 2 para atribuir, isso funciona:

$ 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º estilo, atribua apenas no 2º pipe, isso não funciona:

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

$ 

Então, estou me perguntando se é possível fazer o segundo estilo funcionar, ou seja, se posso ler stdin entre parênteses.

Responder1

Seu segundo comando funciona, o problema é que você está usando bashou qualquer shell que coloque todos os componentes do pipeline em um subshell. myresult2está definido corretamente, mas a variável está imediatamente fora do escopo, a menos que você permaneça no mesmo subshell como aqui:

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

Se você executar este comando em ksh, a atribuição da variável será feita no shell superior, portanto funcionará conforme o esperado.

Alternativamente, você pode definir a opção lastpipe para obter ksho comportamento em bash:

shopt -s lastpipe

Se quiser que isso funcione em uma sessão interativa, você também deve desabilitar o controle de trabalho:

set +m

informação relacionada