プログラムの出力に基づいて、Fish関数でいくつかの変数を動的に設定しようとしたときに問題が発生しました。
問題の範囲をMWEに絞り込んだ。
function example
eval (echo 'set -x FOO 1;')
end
呼ぶ:
>example
>echo $FOO
結果は出力されません。つまり、FOO環境変数はまだ設定されていません。どうすればいいですか?
答え1
より単純な形でも同じことが起こります。
function trythis
set -x foo bar
end
trythis
今実行するとecho $foo
設定されません。これは、Fish自体が変数の範囲を変更しないためです-x
。変数は、既にグローバルであるか、どこにも存在しない限り、基本的に関数に対してローカルです。
努力する:
eval (echo 'set -gx FOO 1;')
ここでは、g
グローバルな状況を表します。これにより、変数は通常のPOSIXexport
値のように動作します。興味深いことに、これはeval
通常と同じように機能します。コマンドラインで直接sans行を使用するset
と設定されるため、プロセス置換は新しいスコープやサブシェルを導入せず、関数内でこのように実行されたときg
$FOO
eval
()
関数の範囲が適用されます。
答え2
コマンドの範囲を指定する必要がありますset
。これがない場合、デフォルトの範囲は関数のローカル範囲です。より環境変数のフィッシュマニュアルセクション変数範囲の基本ルール
努力するset -gx FOO
。