Самый простой подход для эмуляции bash $PROMPT_COMMAND
который приходит мне в голову, - это использовать крюк precmd
, как вы уже поняли. Определите это как
precmd() { eval "$PROMPT_COMMAND" }
и вы можете сделать что-то подобное:
$ PROMPT_COMMAND='echo Hello, it is now $(date)'
Hello, it is now Mon, Mar 31, 2014 7:08:00 PM
$ whoami
user
Hello, it is now Mon, Mar 31, 2014 7:08:21 PM
$
Обратите внимание на одинарные кавычки в этом примере, иначе $(date)
будет раскрыто слишком рано, т.е. уже при определении $PROMPT_COMMAND
а не при вызове перед приглашением.
Если вы хотите сохранить (и не хотите изменять) существующее определение, вы можете использовать этот подход:
$ prmptcmd() { eval "$PROMPT_COMMAND" }
$ precmd_functions=(prmptcmd)
При этом функции prmptcmd
выполняются после существующей функции precmd()
.
Наконец, вот способ, который подходит для использования в программном пакете, который не должен изменять пользовательские или системные файлы и не может вводить команды в интерактивном режиме.
Примером порождения сеанса bash может быть
PROMPT_COMMAND="echo foo" bash
Для появления Zsh вы можете использовать
ZDOTDIR=/program/dir zsh
что вызывает /program/dir/.zshrc
для поиска . В этом файле precmd()
может быть определена, как описано выше. Если вы хотите, чтобы пользовательские настройки дополнительно включали source $HOME/.zshrc
и т.д. В программу тоже .zshrc.
Эта настройка поддерживается, так как файлы за пределами каталога программы не изменяются.
В качестве последнего дополнения, вот еще одно доказательство того, как приветствовать новичка. Используйте следующий код в /program/dir/.zshenv
rc config:
echo define precmd, traps, etc.
autoload -Uz zsh-newuser-install
if [[ ! -e "$HOME/.zshrc" ]]; then
zsh-newuser-install -f
mv $ZDOTDIR/.zshrc $HOME/.zshrc
else
builtin source $HOME/.zshrc
fi