Bash for loop: ¿se pueden agregar los comandos del bucle al historial del shell?

Bash for loop: ¿se pueden agregar los comandos del bucle al historial del shell?

En la terminal bash si ejecuto el siguiente bucle for:

 for i in {1..5}; do echo $i;  done

Los echocomandos no se agregan al historial del shell actual. ¿Es porque los comandos for (en dola 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" foren 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 1se 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 $HISTFILEantes de ejecutarlo. Como dice en man bashesto es porque:

Si HISTFILE no está configurado, o si el archivo de historial no se puede escribir, el historial no se guarda.

HISTFILEno 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 HISTCONTROLen ignorespaceo ignoreboth(que es un alias de ignorespacey 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 HISTCONTROLcomúnmente contiene ignoredupso lo mencionado anteriormente ignoreboth. Todo esto se describe en HISTCONTROLla sección de la página de manual de Bash que puede invocar en man bashsu sistema.

información relacionada