¿Cuál es la forma correcta de leer la entrada estándar dentro de la asignación entre paréntesis de la segunda tubería?

¿Cuál es la forma correcta de leer la entrada estándar dentro de la asignación entre paréntesis de la segunda tubería?

1er estilo, tubería del grupo 2 para asignar, esto 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/"

Segundo estilo, asignar solo en el segundo tubo, esto no funciona:

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

$ 

Entonces me pregunto si es posible hacer que el segundo estilo funcione, es decir, si puedo leer la entrada estándar dentro de la asignación entre paréntesis.

Respuesta1

Su segundo comando funciona, el problema es que está utilizando bashcualquier shell que coloque todos los componentes de las canalizaciones en un subshell. myresult2está configurado correctamente pero la variable queda inmediatamente fuera de alcance a menos que permanezca en el mismo subnivel como aquí:

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

Si ejecuta este comando en ksh, la asignación de variables se realizará en el shell superior, por lo que funcionará como se esperaba.

Alternativamente, puede configurar la opción lastpipe para obtener kshel comportamiento en bash:

shopt -s lastpipe

Si desea que esto funcione en una sesión interactiva, también debe desactivar el control de trabajos:

set +m

información relacionada