Según el manual de Bash , la variable de entorno BASH_COMMANDcontiene
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_COMMANDcontiene 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_COMMANDy la variable BASH_COMMANDcontiene la cadena echo $BASH_COMMAND. ¿Por qué funcionó esta vez, pero no antes?
Hagamos la setcosa otra vez:
$ set | grep BASH_COMMAND=
BASH_COMMAND='echo $BASH_COMMAND'
$
Entonces espera. Que se establece cuando ejecuté que echocomando, y no fue desactivada después. Pero cuando ejecuté setnuevamente, BASH_COMMAND no estaba configurado para el setcomando. No importa con qué frecuencia ejecute el setcomando 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_COMMANDen un archivo, y como $BASH_COMMANDdebería contener un grepcomando, grepdebería grep para ese grepcomando (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 tmpse 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_COMMANDque no existe, y dos veces en el archivo tmp.
P1: ¿Es correcto mi supuesto actual de que:
BASH_COMMANDsolo 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_COMMANDpara 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_COMMANDal comienzo de mi $PROMPT_COMMAND, luego MYVARIABLEcontiene 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_COMMANDejecució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í.