¿Conoces una forma de registrar automáticamente los comandos que regresan con éxito ... con el fin de mantener un registro de cómo te las arreglaste para finalmente configurar con éxito tu entorno para compilar esa pieza obstinada de código?
Primero hay que responder a la pregunta ¿En qué consiste el éxito de un comando?
Probablemente esté pensando "¡qué fácil! Uno que funciona y sale con un código 0!" Para tener una mejor perspectiva de ello, necesitas definir qué es un comando fallido es. La más amplia de las definiciones será cualquier comando que tenga un código de salida distinto de cero . ¿Significa eso que el comando ha fallado?
No. No es así. Los comandos fallan por cualquier número de razones y eso no significa que lo que escribiste fue un error. Usemos un ejemplo muy simple: ssh
. Si te conectas a un servidor remoto y sales limpiamente (escribe exit
cuando haya terminado), obtendrá un estado de salida de cero (0). Sin embargo, si usted poweroff
la máquina, obtendrá un estado de salida de uno (1) cuando se rompan las conexiones.
¿Ha fallado su comando?
Pruébalo. Conéctate vía SSH a cualquier remoto. Salga limpiamente y luego emita el comando echo $?
. Hazlo de nuevo y luego emite poweroff
o cerrar la sesión en el remoto y volver a emitir el comando echo.
También uso Zsh y he creado un prompt personalizado que precede a mi prompt con una marca verde o una "X roja" dependiendo de si el último comando falló o no.
Aquí hay una muestra con el ejemplo de SSH utilizado anteriormente.
¿Ha fallado realmente el comando? No, no lo hizo pero el resultado generó un código de error porque algo en el proceso fallido. Esto también es válido para los comandos que se emiten al compilar el software. Tu comando puede ser sintácticamente perfecto, pero la compilación seguirá fallando porque tienes un error en tu código. ¿Querías que se ignorara esa orden?
Variable de entorno BASH_COMMAND
Por curiosidad, he investigado esto y no es algo trivial. No se puede utilizar history
porque está diseñado para ser interactivo y no con un guión.
En Bash, hay una varialbe de entorno llamada $BASH_COMMAND . Es el comando que está a punto de ser o está siendo ejecutado a menos que el comando haya sido llamado desde un Trampa entonces es el comando que se ejecuta en el momento de la trampa.
Para hacer uso de esto, tendría que ejecutar todos sus comandos dentro de una trampa DEBUG:
trap ‘prev_command=$thiscmd; thiscmd=$BASH_CMD’ DEBUG
mycommand
if $? -eq 0; echo $prev_command >> somefile.txt; else echo “Command failed”; fi
Esta sería la lógica, pero en la práctica, no funciona porque tienes que ejecutar tu comando dentro de una trampa.
No he encontrado un equivalente en Zsh (todavía... pero dudo que siga investigando).
Complementos de Zsh
Estoy en un MacBook Pro, MacOS Catalina, usando iTerm2 con zsh y la extensión oh-my-zsh, así como powerlevel10k.
No soy un fanático de estas cosas especialmente para el usuario novato . Usted está trayendo un montón de complejidad adicional y complementos para embellecer su símbolo del sistema y el entorno de shell. Animo a la gente a que aprenda a hacer esto manualmente para que entienda los fundamentos de su sistema.
El código de mi ejemplo anterior es realmente muy sencillo:
PROMPT="%(?.%F{green}✓.%F{red}