Wie liest man die Standardeingabe in Klammern für die zweite Pipe richtig?

Wie liest man die Standardeingabe in Klammern für die zweite Pipe richtig?

1. Stil, Gruppe 2 Pipe zuordnen, so funktioniert es:

$ 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. Stil, nur in der 2. Pipe zuweisen, das funktioniert nicht:

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

$ 

Daher frage ich mich, ob es möglich ist, den zweiten Stil zum Laufen zu bringen, d. h. ob ich die Standardeingabe innerhalb der Klammerzuweisung lesen kann.

Antwort1

Ihr zweiter Befehl funktioniert. Das Problem besteht darin, dass Sie eine Shell oder eine andere Shell verwenden bash, die alle Pipeline-Komponenten in einer Untershell ablegt. myresult2ist zwar richtig eingestellt, aber die Variable verlässt sofort den Gültigkeitsbereich, sofern Sie nicht in derselben Untershell bleiben, wie hier:

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

Wenn Sie diesen Befehl unter ausführen ksh, erfolgt die Variablenzuweisung in der obersten Shell und funktioniert daher wie erwartet.

Alternativ können Sie die Option „lastpipe“ festlegen, um kshdas folgende Verhalten zu erhalten bash:

shopt -s lastpipe

Wenn dies in einer interaktiven Sitzung funktionieren soll, sollten Sie auch die Jobsteuerung deaktivieren:

set +m

verwandte Informationen