GNU/Linux >> Tutoriales Linux >  >> Ubuntu

¿Por qué esta secuencia de comandos no elimina parte del historial de comandos que funciona en la computadora?

El script se puede encontrar aquí:https://stackoverflow.com/questions/14750650/how-to-delete-history-of-last-10-commands-in-shell

Para mayor comodidad, aquí está:

for x in `seq $1 $2`
do
  history -d $1
done

Puse esto en mi directorio de inclusión (uno que agregué a la RUTA) donde ejecuto muchos otros scripts que he escrito y funcionan bien.

Esto no produce el resultado deseado de eliminar filas de mi historial, de hecho, no hace nada en absoluto.

¿Alguna idea de por qué el comando de historial no funciona? Me pregunto si tiene algo que ver con los directorios.

Información adicional:

Jugué con el código y probé diferentes variaciones. Si pongo un echo delante del history y lo ejecuto, obtengo el siguiente resultado:

[email protected]:~$ idelhistory 300 305
history -d 300
history -d 301
history -d 302
history -d 303
history -d 304
history -d 305
[email protected]:~$ 

Entonces, para mí, parece que debería funcionar perfectamente. No puedo entender por qué. Este script se ejecuta desde /$HOME/Scripts/ y se ha incluido en la RUTA. También intenté ejecutarlo con sudo y nada cambia.

Respuesta aceptada:

En una frase:no funciona porque no lo estás llamando correctamente.

Primero, dado que su secuencia de comandos no comienza con #!/bin/bash , en realidad no es un script bash. El shell que lo ejecute depende de cómo lo invoque. Cuando lo invoca desde la línea de comandos de bash, bash bifurca una nueva instancia de sí mismo (esto tiene que suceder para ejecutar cualquier comando externo de todos modos), y es esta nueva instancia la que ejecuta el script. Entonces, el script se ejecuta con la misma configuración (incluido el historial hasta el momento) que el shell principal. Se ejecuta con diferentes opciones; en particular, el seguimiento del historial está desactivado para los comandos en el script (lo cual le conviene, ya que de lo contrario se agregaría al historial que desea modificar).

Si la instancia de bash que ejecuta el script tiene el HISTFILE el conjunto de variables depende de si se exportó en el padre (lo cual es un poco extraño). Si no se exporta y, por lo tanto, se configura en el secundario, el script secundario no guardará el historial modificado cuando finalice.

Si HISTFILE se exporta, luego el script secundario modificará su archivo de historial. Sin embargo, a menos que haya configurado su shell interactivo para recargar el historial después de cada comando, el historial modificado solo será recogido por instancias de bash recién iniciadas.

Relacionado:Arranque dual con UEFI y LUKS:¿qué necesito saber/hacer?

Si desea ejecutar un fragmento de shell que afecte a la instancia de shell actual, debe ejecutar ese shell en la instancia de shell actual, en lugar de ejecutarlo como un subproceso . Te encontrarías con un problema similar si quisieras hacer otras cosas que afectan el proceso de shell en sí, como cambiar directorios, establecer variables, etc. Usa el . (“punto”) o source integrado para ejecutar un script en el proceso de shell actual.

. idelhistory 300 365

Alternativamente, podría definir esto como una función en su .bashrc .


Ubuntu
  1. Cómo usar el comando de historial en Linux

  2. Ver y eliminar el historial de terminales en Ubuntu 20.04:¿el mejor método?

  3. ¿Comprender el signo de exclamación (!) en Bash?

  4. ¿Parece que faltan las primeras 75 líneas en el historial de comandos?

  5. ¿Comando de historial que muestra el directorio y la fecha?

Cómo usar el comando de historial de Linux

Cómo ver y eliminar el historial de terminales en Ubuntu 20.04

Cómo usar el comando de historial en CentOS 8

Encuentre la ubicación geográfica del servidor Ubuntu a través de la línea de comandos

¿Por qué aparece "reparación de arranque" dos veces en la documentación de Ubuntu?

¿Por qué Ping -f actúa así?