関数に関連する環境変数が正しく展開されない

関数に関連する環境変数が正しく展開されない

.bashrc以下は私のファイルの一部です:

echo_pwd () {
    echo `pwd`
}
export echo_pwd="`echo_pwd`/"

現在のディレクトリのパスを出力する新しい関数echo_pwdと、現在のディレクトリの後にスラッシュが続く新しい環境変数を作成しました。そのため、コマンドラインで環境変数を使用できます (など$PWD)。

ただし、この環境変数は正しく展開されず、常にホーム ディレクトリを参照します。

~/Documents$ env | grep echo_pwd
echo_pwd=/home/pierre/
~/Documents$

環境変数を正しく拡張するにはどうすればいいでしょうか?

注: これは明らかにダミーの例です。私の特定の使用例では、はecho_pwdはるかに複雑な関数です。

答え1

おそらく、関数を実行して変数の値を 1 回だけ設定することになります。

を使用するたびに変数の値を自動的に更新するには、次のようにcdシェルの組み込みをオーバーライドします。cd

cd () {
    builtin cd "$@"
    echo_pwd=$( echo_pwd )/
}

cdこれにより、関数に指定した引数を使用して組み込み関数が呼び出されcd、変数の値が更新されます (exportすでに他の場所にエクスポートされている場合、またはエクスポートする必要がある場合は、これは必要ないことに注意してください)。

完全なセットアップは次のようになります

echo_pwd () {
    printf '%s\n' "$PWD"    # or just: pwd
}
export echo_pwd="$( echo_pwd )/"

cd () {
    builtin cd "$@"
    echo_pwd=$( echo_pwd )/
}

私は選んだ使用してprintf$PWDユーティリティを呼び出す代わりに、pwd私はまた$(...)コマンド置換に使用する

答え2

ではexport echo_pwd="`echo_pwd`/"、変数が設定されたときにコマンド置換が 1 回だけ実行されます。

変数の値を更新する必要がある場合は、再度設定する必要があります。

対話型bashでは、次のように使用できます。PROMPT_COMMANDプロンプトが印刷されるたびに実行されます。

$ PROMPT_COMMAND='echo_pwd="`echo_pwd`/"'
$ cd bar/
$ echo $echo_pwd/
/tmp/foo/bar//
$ cd baz
$ echo $echo_pwd
/tmp/foo/bar/baz/

関連情報