
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