
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 bash
ou qualquer shell que coloque todos os componentes do pipeline em um subshell. myresult2
está 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 ksh
o 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