$PROMPT_COMMAND
我想到的最简单的模仿bash的方法是使用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中也包括etc。此设置是可维护的,因为程序目录之外的任何文件都不会被修改。
最后,这是一个概念证明,也是如何保持新用户的欢迎。在/program/dir/.zshenv
rc配置文件中使用以下代码:
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