¿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.
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.
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):
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".
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 ...
Respuestas:
De acuerdo a
man bash
:Entonces puedes usar:
También:
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 dersync
, por ejemplo.En cualquier caso, sigue siendo una buena idea probar la interactividad ya que puede existir una configuración incorrecta.
fuente
[[ $- =~ 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:
fuente
la
test
herramienta puede verificar esto (desde la página del manual):Entonces puedes usar por ejemplo:
o
fuente
bash <<< 'test -t 0 && echo Y || echo X'
escribeY
,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".
fuente