
En la terminal bash si ejecuto el siguiente bucle for:
for i in {1..5}; do echo $i; done
Los echo
comandos no se agregan al historial del shell actual. ¿Es porque los comandos for (en do
la sección) se ejecutan en el subshell? Si es así, ¿hay alguna manera de ejecutarlos en el shell actual? ¿O no es posible porque está "ejecutándose" for
en ese momento?
Editar: dado que toma todo el bucle for como un solo comando compuesto, si elimino el bucle for y escribo los comandos individuales en cinco líneas, ¿no deberían agregarse los cinco al historial?
Hice lo siguiente:
#!/bin/bash
set -o history
var=5
echo $((var--))
echo $((var--))
echo $((var--))
echo $((var--))
echo $((var--))
y ejecuté el script usando source
. Todavía en la historia muestra sólo una declaración de eco echo $((var--))
y no las cinco. En cambio si en lugar de cinco echo $((var--))
pongo cinco comandos echo 5
, echo 4
,... echo 1
se añaden los cinco al historial.
¿Por qué?
Respuesta1
En primer lugar, su script no guardaría el historial en ~/.bash_history a menos que lo exportara $HISTFILE
antes de ejecutarlo. Como dice en man bash
esto es porque:
Si HISTFILE no está configurado, o si el archivo de historial no se puede escribir, el historial no se guarda.
HISTFILE
no es una variable de entorno, es una variable de shell y, por lo tanto, no está disponible en scripts que son procesos secundarios. E incluso si ejecutaste estos comandos
$ var=5
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
(tenga en cuenta los espacios en blanco después del mensaje) en una sesión interactiva y no en un script, no se guardarían en ~/.bash_history en la práctica ni porque las distribuciones populares de Linux como Ubuntu están configuradas
HISTCONTROL
en ignorespace
o ignoreboth
(que es un alias de
ignorespace
y ignoredups
) para no guarde comandos que comiencen con uno o más espacios en blanco. Esto es especialmente útil si trabaja en un servidor compartido con otros usuarios e intencionalmente no desea guardar un comando determinado en el historial para que otras personas puedan verlo, por ejemplo, porque contiene su contraseña u otra información confidencial.
Pero incluso si no hubiera espacios en blanco antes del comando:
$ var=5
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
$ echo $((var--))
Lo más probable es que termines con una sola echo $((var--))
entrada en ~/.bash_history porque HISTCONTROL
comúnmente contiene
ignoredups
o lo mencionado anteriormente ignoreboth
. Todo esto se describe en HISTCONTROL
la sección de la página de manual de Bash que puede invocar en man bash
su sistema.