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. myresult2
ist 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 ksh
das folgende Verhalten zu erhalten bash
:
shopt -s lastpipe
Wenn dies in einer interaktiven Sitzung funktionieren soll, sollten Sie auch die Jobsteuerung deaktivieren:
set +m