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