BASH admite una $PROMPT_COMMAND
variable de entorno que define un comando que se ejecutará antes de cualquier solicitud interactiva de primer nivel. Estoy buscando un ZSH equivalente a eso.
La documentación dice que hay una función precmd
que puedo definir para lograr eso; Sin embargo, no tengo idea de cómo definirlo a partir de una variable de entorno.
He considerado pasar una variable de entorno que haría que ZSH lea un archivo que contiene la definición de esa función, pero ZSH no parece admitir tales cosas : solo lee archivos globales y luego archivos por usuario. Puedo reemplazarlos pero no puedo agregarlos sin modificar los archivos, lo cual no puedo hacer.
Entonces, ¿cómo defino un enlace de solicitud previa en ZSH a través de una variable de entorno, como lo haría con $PROMPT_COMMAND
BASH?
fuente
exit
yexec
, ok;)
)start() { eval "$@"; echo post-command-code }
y luego usar un enlace zle para ejecutar la línea de comando constart
antepuesto?DEBUG
trampa es un buen hallazgo, pero aún tienes el problema de cómo definirla. He extendido mi respuesta una vez más, pero te dejo escribir tu propia respuesta con respecto a la solución de trampa DEBUG.:)
Respuestas:
El enfoque más simple para emular bash
$PROMPT_COMMAND
que me viene a la mente es usar elprecmd
gancho, como ya descubriste. Defínalo comoy puedes hacer algo así:
Tenga en cuenta las comillas simples en ese ejemplo, de lo contrario
$(date)
se ampliará demasiado pronto, es decir, ya al definir$PROMPT_COMMAND
y no cuando se llama antes de la solicitud.Si desea preservar (y no quiere alterar) la definición existente, puede usar ese enfoque:
Con eso, las
prmptcmd
funciones se ejecutan después de laprecmd()
función existente .Finalmente, aquí hay una manera adecuada para usar en un paquete de programa, que no debe modificar los archivos del usuario o del sistema ni puede ingresar los comandos interactivos.
Un ejemplo para generar una sesión bash podría ser
Para generar zsh puedes usar
lo que hace
/program/dir/.zshrc
que sea de origen. En este archivo, elprecmd()
gancho se puede definir como se explicó anteriormente. Si desea que la configuración del usuario, además, incluyasource $HOME/.zshrc
etc. en el programa .zshrc, también. Esta configuración se puede mantener, ya que no se modifican archivos fuera del directorio del programa.Como última adición, aquí hay una prueba de concepto de cómo mantener al nuevo usuario bienvenido también. Use el siguiente código en su
/program/dir/.zshenv
archivo de configuración rc:fuente
.zshrc
? (3) Un ejemplo:foo() { echo foo }; bar() { echo bar }; precmd_functions=(foo bar)
esto se ejecutafoo()
ybar()
además deprecmd()
.PROMPT_COMMAND="echo foo" bash
, ¿verdad? ¿Es esto una posibilidad para el desove zsh:ZDOTDIR=/program/dir zsh
. Luego/program/dir/.zshrc
se obtiene al inicio, donde puede definir el gancho precmd (). Si desea que el usuario además incluyasource $HOME/.zshrc
etc. en el programa zshrc. Esto debería ser fácil de mantener, ya que no se modifican archivos fuera del directorio del programa.Como dice @mypy, Zsh's
precmd
funciona de manera similar a BashPROMPT_COMMAND
.Aquí hay un ejemplo que funciona para Bash o Zsh y no usa
eval
:Ejecutar desde scripts de inicio de shell:
y:
Las indicaciones aquí son solo ejemplos. Definitivamente, uno puede hacer cosas mucho más difíciles.
Para obtener detalles sobre cómo configurar las funciones de solicitud, consulte: http://zsh.sourceforge.net/Doc/Release/Functions.html#index-precmd y http://www.gnu.org/software/bash/manual/bashref.html # Imprimiendo un mensaje .
Para obtener detalles sobre las expansiones rápidas, consulte http://zsh.sourceforge.net/Doc/Release/Prompt-Expansion.html y http://www.gnu.org/software/bash/manual/bashref.html#Printing-a -Prompt .
fuente