Переменные окружения некорректно расширяются, если они связаны с функцией.

Переменные окружения некорректно расширяются, если они связаны с функцией.

Вот часть моего .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/

Связанный контент