機能に関連する環境変数が正しく拡張されません。

機能に関連する環境変数が正しく拡張されません。

これは私のファイルの一部です.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

関数を実行し、変数値を一度だけ設定できます。

使用時に変数値を自動的に更新するには、次のようにシェルの組み込み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`/"変数の設定時にコマンドの置換が一度だけ行われます。

変数の値を更新する必要がある場合は、リセットする必要があります。

対話型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/

関連情報