¿Cómo puedo saber (in ~/.bashrc
) si estoy ejecutando en modo interactivo o, por ejemplo, ejecutando un comando a través de ssh. Quiero evitar la impresión de secuencias de escape ANSI .bashrc
si es la última.
¿Cómo puedo saber (in ~/.bashrc
) si estoy ejecutando en modo interactivo o, por ejemplo, ejecutando un comando a través de ssh. Quiero evitar la impresión de secuencias de escape ANSI .bashrc
si es la última.
Respuestas:
De acuerdo a man bash
:
PS1 está configurado y $: incluye i si bash es interactivo, lo que permite que un script de shell o un archivo de inicio pruebe este estado.
Entonces puedes usar:
if [[ $- == *i* ]]
then
do_interactive_stuff
fi
También:
Cuando se inicia un shell interactivo que no es un shell de inicio de sesión, bash lee y ejecuta comandos desde /etc/bash.bashrc y ~ / .bashrc, si existen estos archivos.
Por ~/.bashrc
lo tanto, solo se obtiene para shells interactivos. A veces, las personas lo obtienen ~/.bash_profile
o ~/.profile
es incorrecto ya que interfiere con el comportamiento esperado. Si desea simplificar el mantenimiento del código que es común, debe usar un archivo separado para contener el código común y obtenerlo independientemente de ambos archivos rc.
Lo mejor es que no hay salida a la salida estándar de inicio de sesión de rc
archivos como ~/.bash_profile
o ~/.profile
, ya que puede interferir con el funcionamiento adecuado de rsync
, por ejemplo.
En cualquier caso, sigue siendo una buena idea probar la interactividad ya que puede existir una configuración incorrecta.
[[ $- =~ i ]] && echo interactive
i
~/.bash_profile
o ~/.profile
es incorrecto, ya que interfiere con el comportamiento esperado . ¿Qué opinas de abastecimiento ~/.bashrc
de ~/.bash_login
? Como el shell de inicio de sesión no necesita ser interactivo, supongo que también es incorrecto.
Utilizar:
if tty -s; then echo interactive; fi
la test
herramienta puede verificar esto (desde la página del manual):
-t FD True if FD is opened on a terminal.
Entonces puedes usar por ejemplo:
if [ -t 0 ] ; then
echo stdin is a terminal
.....
fi
o
if [ -t 1 ] ; then
echo stdout is a terminal
fi
bash <<< 'test -t 0 && echo Y || echo X'
escribe Y
, bash -c 'test -t 0 && echo Y || echo X'
escribeX
Normalmente miro la salida del programa tty.
Si estás en un tty, te dirá en qué tty estás. Si no está en modo interactivo, generalmente le dirá algo como "no es un tty".