パイプラインで変数の割り当てが機能しません。

パイプラインで変数の割り当てが機能しません。

パイプ時に変数に値が割り当てられないのはなぜですか?たとえば、

a=15|echo $a

コマンドをグループ化して{}パイプに渡そうとしましたが、{}パイプの後のコマンドは初期化された値を使用できません。

ベストアンサー1

このコマンドは、割り当てが出力を生成せず、echo標準入力から読み取らないため、ほとんど意味がありません。

代わりに:

a=15; printf '%s\n' "$a"

さらに、パイプラインの2つの部分は異なる環境で実行されるため、a左側を設定してもaパイプラインの右側の値には影響しません。

例:

{ a=15; printf 'on the left:\ta=%s\n' "$a"; } | { cat; printf 'on the right:\ta=%s\n' "$a"; }

出力:

on the left:    a=15
on the right:   a=

...a上記の操作を実行する前に値がないとします。その場合、右側が値を取得します。パイプラインのどの部分でも値を設定しても、a環境の値は変わりません。

lastpipeシェルオプションが設定されている場合そしてシェルはジョブ制御なしで実行され(非対話型スクリプトであるかのように)、パイプラインの最後の部分は周辺スクリプトと同じ環境で実行されます。これは、割り当てがパイプラインで「ライブ」になることを意味します。

#!/bin/bash

shopt -s lastpipe

a=10

printf 'LHS: a=%s\n' "$a" | { cat; printf 'RHS: a=%s\n' "$a"; a=30; }

printf 'a is now %s\n' "$a"

出力:

LHS: a=10
RHS: a=10
a is now 30

削除shopt -s lastpipe:

LHS: a=10
RHS: a=10
a is now 10

おすすめ記事