bashrcから関数を実行しますが、エクスポートされた変数を変更します

bashrcから関数を実行しますが、エクスポートされた変数を変更します

私は、1 分ごとに更新して変数を外部化する関数を bashrc から実行しようとしています。次のようになります。

export CFN = ''
_some_fn
{
    export CFN = 'test'
    sleep 60
    _some_fn &
}
_some_fn &

'test' は変数ですが、これをソースすると、関数内から CFN にアクセスできなくなります。これは、サブシェルで実行されているためと思われます。エクスポートされた CFN の値を変更する方法はありますか?

答え1

これは現在の関数では不可能です。関数をバックグラウンドにするとすぐに、&プロセス スタックのコピーが取得されて終了します。その機能を明示的に構築しない限り、スタックへの変更をジョブのコピーに伝播する方法はなく、同様に、関数のスタックへの変更を現在のスタックに取り込むことも不可能です。

変数を変更するためにプロセス間通信を設定することもできますが、これを正しく行うのは常に非常に難しいため、ユースケースが何であるかわかりません。双方向の IPC の例:

mkfifo -m 600 /var/tmp/cfn-to-fn
mkfifo -m 600 /var/tmp/cfn-from-fn
export CFN = ''
_some_fn
{
     read CFN < /var/tmp/cfn-to-fn
     # do something with the new CFN here
     echo 'processed data' >/var/tmp/cfn-from-fn
     _some_fn &
}
_some_fn &
echo 'processme' > /var/tmp/cfn-to-fn
cat /var/tmp/cfn-from-fn

mkfifoの代替手段は数多くありますが、一般的にはすべて次のタグで言及されています。プロセス間通信物事をシンプルにしておくことに価値を見出すのであれば、これらを気にせず、片方の端でデータをファイルに書き込み、もう一方の端でそれを読み取るだけにしてください。D-Bus は、TCP/ または UDP/IP (またはを使用netcat)とともに、ほとんどの UNIX システム上の大きな IPC バスですncが、これらを使用するシェル スクリプトはあまり見たことがありません。

最後の選択肢は、すべてをそのままにして、スクリプトをバックグラウンド ジョブとして実行せずに動作させ、実行中に環境を微調整できるようにすることです。

関連情報