The simplest approach to emulate bash's $PROMPT_COMMAND
which comes to my mind is to use the precmd
hook, as you already figured out. Define it as
precmd() { eval "$PROMPT_COMMAND" }
and you can do something like that:
$ 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
$
Please note the single quotes in that example, otherwise $(date)
will get expanded too early, i.e. already when defining $PROMPT_COMMAND
and not when called before the prompt.
If you want to preserve (and don't want to alter) the existing definition, you can use that approach:
$ prmptcmd() { eval "$PROMPT_COMMAND" }
$ precmd_functions=(prmptcmd)
With that the prmptcmd
functions is executed after the existing precmd()
function.
Finally, here is a way which is suitable for use in a program package, which neither should modify user or system files nor can enter the commands interactive.
An example to spawn a bash session could be
PROMPT_COMMAND="echo foo" bash
To spawn zsh you can use
ZDOTDIR=/program/dir zsh
which causes /program/dir/.zshrc
to be sourced. In this file the precmd()
hook can be defined as explained above. If you want the user's settings in addition include source $HOME/.zshrc
etc. in the program's .zshrc, too.
This setup is maintainable, as no files outside the program directory are modified.
As a last addition, here is a proof of concept how to keep the newuser welcome, too. Use the following code in your /program/dir/.zshenv
rc config file:
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
Best Answer
You will find a detailed answer and an example here. The idea is to write the line before PS1 using the
precmd
callback, use$COLUMNS
, and a bit of math to calculate the position of the text on the right side of the screen. Knowledge of escape sequences will also help you with cursor positioning and colouring.Another solution can be to use a theme from Oh My ZSH.