historial: la lista solo ejecuta comandos correctamente

10

Me pregunto si hay una manera de usar el comando de historial, pero solo enumere los comandos que se ejecutaron correctamente. Del mismo modo, ¿habría alguna forma de enumerar los que produjeron errores?

Sé que cada comando tiene un estado de salida de:

0- Ejecución exitosa del comando
1: el comando falla debido a un error durante la expansión o la redirección, el estado de salida es mayor que cero.
2- Uso de comando incorrecto
12- Comando encontrado pero no ejecutable
127- Comando no encontrado

y puede verificarse con el comando echo $?
desde: http://www.linuxnix.com/2011/03/find-exit-status-script-command-linux.html

Ejemplo:

Después de ejecutar estos 4 comandos:

ls
help
lss
ls nonexistentfile

Intenté probar para imprimir solo comandos exitosos (estado de salida de 0), que debería ser solo 'ls' y 'help':

for j in `history | tail -5 | head -4 | cut -d ' ' -f5-`; do $j > cmd_out; if [[ `echo $?` != 0 ]]; then :; else echo $j | grep -v 'bash'; fi; done; rm cmd_out

Esto produce:

ls
help
bash: lss: command not found
ls
bash: nonexistentfile.txt: command not found

Esto funciona un poco, pero hay dos problemas:

  1. Por alguna razón, grep -v 'bash'no excluye líneas que contienen 'bash', pero si lo hago grep 'bash', solo incluirá las líneas con 'bash', no estoy seguro de por qué una funciona y no la otra.
  2. Está separando cada línea / comando por cadena. El último lscomando debería ser
    ls nonexistentfile, pero se está ejecutando lsy nonexistentfilecomo comandos separados.

¿Alguna idea sobre lo que debo ajustar en el comando o cómo hacer esto?

lkisac
fuente

Respuestas:

4

Este fue un truco que usé una vez en una cuenta compartida para rastrear quién hizo qué:

PROMPT_COMMAND="history -a; sed -i '\$s/\$/ \#$NAME/' $HISTFILE; history -r; $PROMPT_COMMAND"

Escribe el historyantes de que PROMPTse muestre: en efecto, después de cada comando. Puede modificar esto para usar guardar el código de salida en el historial:

PROMPT_COMMAND="CODE=$?; history -a; sed -i '\$s/\$/ \#\$CODE/' $HISTFILE; history -r; $PROMPT_COMMAND"

Esto dejaría entradas en su historial como:

$ history 2
 1271  vim .bashrc #0
 1272  history 2

(La última entrada se actualizará después de quehistory salga el comando, por lo que el código de salida no es visible en esta salida).

Esto tiene el efecto molesto de que el historial en su solicitud tendrá el comentario:

$ # press up
$ history 2 #0

El comentario generalmente no afecta la ejecución o la salida, pero hace que la edición sea difícil.

Ahora puede ver grepsu historial para ver qué códigos salieron con éxito:

history | grep '#0$'
# or grep '#[^0]*$' for unsuccessful commands.
muru
fuente
Lo probé tanto en Mobaxterm como en Putty, y obtuve ls #$CODE, ll #$CODEel resultado del historial. No estoy seguro si funciona para usted, pero tuve que cambiar sed -i '\$s/\$/ \#\$CODE/' $HISTFILE'a sed -i '\$s/\$/ \#$CODE/' $HISTFILE. Tomé el `` antes de $ CODE
lkisac
@lkisac Curiosamente para mí, dio #(sin código) sin el escape. Debe haber algún problema de citas.
muru