El "historial" deja de funcionar cuando se ejecuta dentro del script bash

9

Estoy escribiendo un script simple para grep mi historial de bash para encontrar una cadena particular. En la línea de comando, puedo hacer lo siguiente, que funciona bien:

history | grep git

Sin embargo, cuando creo un script bash con el mismo comando que el anterior, de repente historyno devuelve nada:

#!/bin/bash
history | grep git

Cuando elimino la primera línea #!/bin/bash, mi script vuelve a funcionar. ¿Que está sucediendo aquí? ¿Cómo puedo usar historydentro de un script bash?

Martin Vegter
fuente

Respuestas:

8

Lo siguiente es para bash 4.0 or higher only, pero hace el truco. :)

#!/bin/bash -i
history | grep sometext

¡Trabajos! Pruébalo. ( -i= I nteractive, una bandera no disponible para 3.x golpe y anterior)

error de sintaxis
fuente
Gracias también al tipo que recientemente me rechazó porque puede. (Probablemente un bashusuario v3, por mera frustración, jaja). Al menos para Martin, mi solución fue de gran ayuda, eso es (al menos) un consuelo.
syntaxerror
Tenía la misma pregunta cuando estaba escribiendo una herramienta que registra el trabajo fuera del horario de oficina para ingenieros de soporte 24/7. ¡Gracias!
Henry van Megen
14

Cuando ejecuta un script de shell bash, por ejemplo ejecutando un archivo ejecutable cuya línea shebang es #!/bin/bash, el script se ejecuta en un shell no interactivo. Una de las características de un shell no interactivo es que el historial está deshabilitado. Entonces, si desea que su script pueda usar el historial, necesitaría hacer algo como esto:

#!/bin/bash
HISTFILE=~/.bash_history   # Or wherever you bash history file lives
set -o history             # enable history
history | grep git

Por supuesto, en este caso podrías haber hecho:

grep git ~/.bash_history

Dado que los dos anteriores requieren que el archivo de historial ( ~/.bash_history) esté actualizado, lo que casi seguro no será.

No estoy seguro de cómo ejecutar su script después de que se elimine la línea shebang. Obtener el archivo (p. Ej., Con .) no es lo mismo que ejecutar el script porque los comandos se ejecutan en el shell actual, que tiene el historial habilitado.

rici
fuente
¿Qué hay de hacer history -ajusto después del comando set para asegurarse de que los últimos comandos se agreguen primero al archivo?
44
@ illuminÉ: no ayudará. El shell comenzó a ejecutar el script es un proceso completamente diferente; comienza con una historia frsh vacía.
rici