Qual é a maneira correta de ler stdin dentro da atribuição de parentesco do 2º tubo

0

1º estilo, grupo 2 pipe 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 segundo canal, 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 pensando se é possível fazer o segundo estilo funcionar, ou seja, se posso ler stdin dentro da atribuição de parênteses.

    
por 林果皞 23.06.2016 / 10:44

1 resposta

3

Seu segundo comando funciona, o problema é que você está usando bash ou qualquer shell que coloque todos os componentes de pipelines 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 mais alto, portanto, funcionará como esperado.

Como alternativa, você pode definir a opção lastpipe para obter o comportamento ksh em bash :

shopt -s lastpipe

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

set +m
    
por 23.06.2016 / 11:45

Tags