Según el manual de Bash , la variable de entorno BASH_COMMAND
contiene
El comando que se está ejecutando actualmente o que se va a ejecutar, a menos que el shell esté ejecutando un comando como resultado de una captura, en cuyo caso es el comando que se ejecuta en el momento de la captura.
Si entiendo el caso de la esquina de la trampa, si entiendo correctamente, esto significa que cuando ejecuto un comando, la variable BASH_COMMAND
contiene ese comando. No está absolutamente claro si esa variable se desarma después de la ejecución del comando (es decir, solo está disponible mientras el comando se está ejecutando, pero no después), aunque se podría argumentar que dado que es "el comando que se está ejecutando actualmente o está por ejecutarse" , no es el comando que era solo ejecutar.
Pero revisemos:
$ set | grep BASH_COMMAND=
$
Vacío. Hubiera esperado ver BASH_COMMAND='set | grep BASH_COMMAND='
o tal vez soloBASH_COMMAND='set'
, pero vacío me sorprendió.
Probemos algo más:
$ echo $BASH_COMMAND
echo $BASH_COMMAND
$
Bueno, eso tiene sentido. Ejecuto el comando echo $BASH_COMMAND
y la variable BASH_COMMAND
contiene la cadena echo $BASH_COMMAND
. ¿Por qué funcionó esta vez, pero no antes?
Hagamos la set
cosa otra vez:
$ set | grep BASH_COMMAND=
BASH_COMMAND='echo $BASH_COMMAND'
$
Entonces espera. Que se establece cuando ejecuté que echo
comando, y no fue desactivada después. Pero cuando ejecuté set
nuevamente, BASH_COMMAND
no estaba configurado para el set
comando. No importa con qué frecuencia ejecute el set
comando aquí, el resultado sigue siendo el mismo. Entonces, ¿se establece la variable al ejecutar echo
, pero no al ejecutar set
? Veamos.
$ echo Hello AskUbuntu
Hello AskUbuntu
$ set | grep BASH_COMMAND=
BASH_COMMAND='echo $BASH_COMMAND'
$
¿Qué? Entonces, ¿la variable se configuró cuando ejecuté echo $BASH_COMMAND
, pero no cuando ejecuté echo Hello AskUbuntu
? ¿Dónde está la diferencia ahora? ¿La variable solo se establece cuando el comando actual en sí mismo obliga al shell a evaluar la variable? Probemos algo diferente. Tal vez algún comando externo esta vez, no un bash incorporado, para variar.
$ /bin/echo $BASH_COMMAND
/bin/echo $BASH_COMMAND
$ set | grep BASH_COMMAND=
BASH_COMMAND='/bin/echo $BASH_COMMAND'
$
Hmm, ok ... otra vez, la variable fue establecida. Entonces, ¿es correcta mi suposición actual? ¿La variable solo se establece cuando debe evaluarse? ¿Por qué? ¿Por qué? Por razones de rendimiento? Hagamos un intento más. Intentaremos grep $BASH_COMMAND
en un archivo, y como $BASH_COMMAND
debería contener un grep
comando, grep
debería grep para ese grep
comando (es decir, para sí mismo). así que hagamos un archivo apropiado:
$ echo -e "1 foo\n2 grep\n3 bar\n4 grep \$BASH_COMMAND tmp" > tmp
$ grep $BASH_COMMAND tmp
grep: $BASH_COMMAND: No such file or directory
tmp:2 grep <-- here, the word "grep" is RED
tmp:4 grep $BASH_COMMAND tmp <-- here, the word "grep" is RED
tmp:2 grep <-- here, the word "grep" is RED
tmp:4 grep $BASH_COMMAND tmp <-- here, the word "grep" is RED
$ set | grep BASH_COMMAND=
BASH_COMMAND='grep --color=auto $BASH_COMMAND tmp'
$
Ok, interesante El comando grep $BASH_COMMAND tmp
se expandió a grep grep $BASH_COMMAND tmp tmp
(la variable se expande solo una vez, por supuesto), por lo que busqué grep
, una vez en un archivo $BASH_COMMAND
que no existe, y dos veces en el archivo tmp
.
P1: ¿Es correcto mi supuesto actual de que:
BASH_COMMAND
solo se establece cuando un comando intenta evaluarlo realmente; y- se no desactívala después de la ejecución de un comando, a pesar de que la descripción que nos puede llevar a creer eso?
P2: En caso afirmativo, ¿por qué? ¿Actuación? Si no, ¿de qué otra manera se puede explicar el comportamiento en la secuencia de comandos anterior?
P3: Por último, ¿hay algún escenario en el que esta variable realmente pueda usarse de manera significativa? En realidad estaba tratando de usarlo $PROMPT_COMMAND
para analizar el comando que se estaba ejecutando (y hacer algunas cosas dependiendo de eso), pero no puedo, porque tan pronto como, dentro de mi $PROMPT_COMMAND
, ejecuto un comando para mirar la variable $BASH_COMMAND
, la variable obtiene conjuntos para ese comando. Incluso cuando lo hago MYVARIABLE=$BASH_COMMAND
al comienzo de mi $PROMPT_COMMAND
, luego MYVARIABLE
contiene la cadena MYVARIABLE=$BASH_COMMAND
, porque una asignación también es un comando. (Esta pregunta no se trata de cómo podría obtener el comando actual dentro de una $PROMPT_COMMAND
ejecución. Hay otras formas, lo sé).
Es un poco como con el principio de incertidumbre de Heisenberg. Simplemente observando la variable, la cambio.
bash
über-gurus allí.