2番目のパイプの角かっこ割り当て内で標準入力を読み取る正しい方法は何ですか

2番目のパイプの角かっこ割り当て内で標準入力を読み取る正しい方法は何ですか

最初のスタイル、割り当てる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

関連情報