¿Cómo puedo comprobar en bash si un shell se ejecuta en modo interactivo?


46

¿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.


Elegir si imprimir secuencias de escape o no es mejor basarse en el valor $ TERM y no en la interactividad del shell. La variable identifica las capacidades del terminal del cliente, que es la parte que interpreta las secuencias de escape.
yrk

Respuestas:


53

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.


77
Tenga en cuenta que $ - puede contener una i, no necesariamente igual. Yo uso[[ $- =~ i ]] && echo interactive
Alex Howansky

1
@AlexHowansky: los asteriscos en la prueba de igualdad hacen que sea una prueba para conteneri
Dennis Williamson

Oh, wow, ni siquiera los noté, parecen comillas dobles en mi monitor. Puede ser hora de aumentar el tamaño de la fuente. <envejecer>
Alex Howansky

A veces, las personas lo obtienen ~/.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.
Piotr Dobrogost

1
@PiotrDobrogost: Esta es una excelente discusión sobre los archivos de inicio de shell.
Dennis Williamson

12

Utilizar:

if tty -s; then echo interactive; fi

Parece que no funciona
Steven Shaw

esto tampoco parece funcionar para mí, creo que esta es la respuesta correcta: stackoverflow.com/a/49064632/1223975
Alexander Mills el

esto verifica la presencia de un TTY en la entrada estándar; aunque puede estar relacionado, pero no es lo mismo que el modo interactivo de shell, que se indica mediante el indicador "-i" de shell.
yrk

no funciona. ¿Por qué la gente votó?
Setop

11

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

Agradable y parece ser portátil entre conchas. PRUEBA bash <<< 'test -t 0 && echo Y || echo X'escribe Y, bash -c 'test -t 0 && echo Y || echo X'escribeX
kyb

1
esto también verifica que la entrada estándar es un TTY; aunque puede estar relacionado, pero NO es lo mismo que el modo interactivo del shell, que se solicita e indica mediante el indicador "-i" del shell.
yrk

6

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".


3
tty -s establecerá un valor de retorno de 0 si está en un terminal o de lo contrario 1 sin darle salida. Puede usarlo como 'if tty -s; entonces _interactivo; fi '
BillThor

¡Gracias! Ha sido un largo tiempo desde que tenía que hacer este tipo de cosas y supongo que se me olvidó algunos de los detalles ...
Chris
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.