¿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 .bashrcsi 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 .bashrcsi 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 ~/.bashrclo tanto, solo se obtiene para shells interactivos. A veces, las personas lo obtienen ~/.bash_profileo ~/.profilees 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 rcarchivos como ~/.bash_profileo ~/.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_profileo ~/.profilees incorrecto, ya que interfiere con el comportamiento esperado . ¿Qué opinas de abastecimiento ~/.bashrcde ~/.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 testherramienta 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".