O BASH suporta uma $PROMPT_COMMAND
variável de ambiente que define um comando a ser executado antes de qualquer prompt interativo de primeiro nível. Estou à procura de um equilíbrio ZSH disso.
A documentação diz que há uma função precmd
que posso definir para conseguir isso; no entanto, não tenho idéia de como defini-lo a partir de uma variável de ambiente.
Eu considerei passar uma variável de ambiente que faria o ZSH ler um arquivo contendo a definição dessa função, mas o ZSH não suporta essas coisas : ele lê apenas arquivos globais e arquivos por usuário. Posso substituí-los, mas não posso adicioná-los sem modificar os arquivos, o que não posso fazer.
Então, como defino um gancho de pré-prompt no ZSH por meio de uma variável de ambiente, como faria usando o $PROMPT_COMMAND
BASH?
fonte
exit
eexec
, ok;)
)start() { eval "$@"; echo post-command-code }
e depois use um zle-binding para executar a linha de comando com ostart
prefixo?DEBUG
armadilha é uma boa descoberta, mas você ainda tem o problema de defini-la. Estendi minha resposta mais uma vez, mas deixo para você escrever sua própria resposta sobre a solução de interceptação DEBUG.:)
Respostas:
A abordagem mais simples para emular o bash,
$PROMPT_COMMAND
que me vem à mente, é usar oprecmd
gancho, como você já descobriu. Defina-o comoe você pode fazer algo assim:
Observe as aspas simples nesse exemplo; caso contrário, ele
$(date)
será expandido muito cedo, ou seja, já ao definir$PROMPT_COMMAND
e não quando chamado antes do prompt.Se você deseja preservar (e não deseja alterar) a definição existente, pode usar essa abordagem:
Com isso, as
prmptcmd
funções são executadas após aprecmd()
função existente .Finalmente, aqui está uma maneira que é adequada para uso em um pacote de programas, que não deve modificar arquivos de usuário ou sistema nem pode inserir os comandos interativos.
Um exemplo para gerar uma sessão bash pode ser
Para gerar o zsh, você pode usar
o que causa
/program/dir/.zshrc
a origem. Neste arquivo, oprecmd()
gancho pode ser definido como explicado acima. Se você deseja que as configurações do usuário também incluamsource $HOME/.zshrc
etc. no .zshrc do programa, também. Essa configuração é sustentável, pois nenhum arquivo fora do diretório do programa é modificado.Como última adição, aqui está uma prova de conceito de como manter o novo usuário bem-vindo também. Use o seguinte código no seu
/program/dir/.zshenv
arquivo de configuração rc:fonte
.zshrc
? (3) Um exemplo:foo() { echo foo }; bar() { echo bar }; precmd_functions=(foo bar)
Isso executafoo()
ebar()
além deprecmd()
.PROMPT_COMMAND="echo foo" bash
, certo? Será esta uma possibilidade de desova zsh:ZDOTDIR=/program/dir zsh
. Em seguida,/program/dir/.zshrc
é originado no início, onde você pode definir o gancho precmd (). Se você deseja que o usuário além disso incluasource $HOME/.zshrc
etc. no zshrc do programa. Isso deve ser fácil de manter, pois nenhum arquivo fora do diretório do programa é modificado.Como @mypy afirma, o Zsh's
precmd
funciona da mesma forma que o BashPROMPT_COMMAND
.Aqui está um exemplo que funciona para Bash ou Zsh e não usa
eval
:Execute a partir dos scripts shell init:
e:
As instruções aqui são apenas exemplos. Definitivamente, pode-se fazer coisas muito mais complicadas.
Para obter detalhes sobre a configuração de funções de prompt, consulte: http://zsh.sourceforge.net/Doc/Release/Functions.html#index-precmd e http://www.gnu.org/software/bash/manual/bashref.html # Imprimindo um prompt .
Para obter detalhes sobre expansões de prompt, consulte http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html e http://www.gnu.org/software/bash/manual/bashref.html#Printing-a -Prompt .
fonte