2番目のパイプの括弧内のstdinを正しく読み取る方法は何ですか

2番目のパイプの括弧内のstdinを正しく読み取る方法は何ですか

1 番目のスタイル、割り当てるグループ 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

関連情報