1 votos

¿Cómo llevar la cuenta de los comandos exitosos en la línea de comandos?

Normalmente sólo copio/pego las acciones exitosas que hago en la línea de comandos en un archivo de texto. Es un proceso un poco propenso a errores y engorroso y a veces me olvido de hacerlo.

¿Sabe usted de una manera de registrar automáticamente los comandos que regresan con éxito (estoy pensando en cosas como cmake, hacer, etc, sino también los comandos básicos como cd ) a un archivo de texto para mantener un registro de cómo se las arregló para configurar finalmente con éxito su entorno para compilar ese pedazo de código obstinado? Por ejemplo...

Estoy en un MacBook Pro, MacOS Catalina, usando iTerm2 con zsh y oh-my-zsh y la extensión, así como powerlevel10k .

2voto

Douglas Puntos 10417

¿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 green check o una "X roja" red x dependiendo de si el último comando falló o no.

Aquí hay una muestra con el ejemplo de SSH utilizado anteriormente.

Green Check Prompt

Red X Prompt

¿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}

1voto

meataxe Puntos 6

Como el usuario3439894 ya dijo en el comentario, hay un archivo de historia que registra todos los comandos emitidos en la línea de comandos, independientemente del éxito o el fracaso. Esta lista de comandos es finita, sin embargo, y se deshará del comando más antiguo después de haber emitido un número de comandos. No lo he comprobado, pero creo que en promedio serían entre 500 y 1000 comandos (tal vez más).

El hecho de que una orden haya tenido éxito o no, no se almacena más allá de la última orden dada. El código de salida del último comando puede ser recuperado usando la función $? (un valor distinto de cero indica que se ha producido un error).

La razón por la que no se almacena durante más tiempo es que en casi todos los casos no sería útil.

Ejemplo:

  1. Acaba de abrir el Terminal y se encuentra en su directorio de inicio (normalmente indicado por una simple tilde ~ ).
  2. Ahora emite cd Downloads , que en circunstancias normales será una orden emitida con éxito.
  3. Encontrarse en Downloads ahora, puede intentar recuperar el último comando pulsando la tecla de flecha hacia arriba y pulsando Enter una vez más.
  4. Sin embargo, ahora, a menos que haya creado manualmente otro directorio llamado Downloads dentro de su Downloads verás que esta vez el comando fallará.

Por lo tanto, para tener una lista útil de los comandos que se emitieron con éxito, tendría que registrar también el entorno, que incluye la ruta actual en la que se encontraba, los archivos que estaban disponibles en el momento en que emitió el comando, así como su contenido y posiblemente otras cosas que puedo haber olvidado enumerar.

Por lo tanto, se ve que esa lista es imposible de obtener o, peor aún, de mantener.

Si esto es para que aprendas cómo funciona zsh, es mejor que busques en las páginas de manual o en los recursos en línea en lugar de registrar tediosamente los comandos ejecutados con éxito junto con sus argumentos en un archivo de texto, ya que la próxima vez que los ejecutes, puede que ya no tengan éxito o proporcionen resultados que no esperarías, obstaculizando efectivamente tu experiencia de aprendizaje al confundirte.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X