最初のスタイル、割り当てる2番目のパイプセットは次のように動作します。
$ 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番目のスタイル、2番目のパイプにのみ割り当てると機能しません。
$ curl -L 'https://archive.org/wayback/available?url=stackoverflow.com' 2>/dev/null | myresult2=$(jq '.archived_snapshots.closest.url'); echo "$myresult2"
$
だから私は2番目のスタイルを操作できるかどうか、つまり括弧で囲まれた割り当て内でstdinを読むことができるかどうか疑問に思います。
答え1
2番目のコマンドは機能しますが、問題はbash
すべてのパイプコンポーネントをサブシェルに入れるシェルを使用していることです。myresult2
正しく設定されているが、次のように同じサブシェルにとどまらない限り、変数はすぐに範囲外です。
curl -L 'https://archive.org/wayback/available?url=stackoverflow.com' \
2>/dev/null | {
myresult2=$(jq '.archived_snapshots.closest.url'); echo "$myresult2" ; }
でこのコマンドを実行すると、ksh
変数の割り当ては最上位シェルで実行されるため、期待どおりに機能します。
または、lastpipe オプションを設定してksh
次の動作を得ることもできますbash
。
shopt -s lastpipe
対話型セッションで機能させるには、ジョブ制御も無効にする必要があります。
set +m