A abordagem mais simples para emular o $PROMPT_COMMAND
do bash que me vem à mente é usar o precmd
hook, como você já descobriu. Defina-o como
precmd() { eval "$PROMPT_COMMAND" }
e você pode fazer algo assim:
$ 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
$
Observe as aspas simples nesse exemplo, caso contrário, $(date)
será expandido muito cedo, ou seja, quando definir $PROMPT_COMMAND
e não quando chamado antes do prompt.
Se você quiser preservar (e não quiser alterar) a definição existente, use essa abordagem:
$ prmptcmd() { eval "$PROMPT_COMMAND" }
$ precmd_functions=(prmptcmd)
Com isso, as funções prmptcmd
são executadas após a função precmd()
existente.
Finalmente, aqui está uma maneira que é adequada para uso em um pacote de programas, que não deve modificar os arquivos do usuário ou do sistema, nem pode inserir os comandos interativos.
Um exemplo para gerar uma sessão bash poderia ser
PROMPT_COMMAND="echo foo" bash
Para gerar o zsh, você pode usar
ZDOTDIR=/program/dir zsh
que faz com que /program/dir/.zshrc
seja originado. Neste arquivo, o gancho precmd()
pode ser definido como explicado acima. Se você quiser que as configurações do usuário além incluam source $HOME/.zshrc
etc. no .zshrc do programa, também.
Esta configuração é sustentável, pois nenhum arquivo fora do diretório do programa é modificado.
Como último acréscimo, aqui está uma prova de conceito de como manter o novo usuário bem-vindo também. Use o seguinte código no seu arquivo de configuração /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