¿Cómo puedo registrar bash si un shell se está ejecutando en modo interactivo?

¿Cómo puedo registrar bash si un shell se está ejecutando en modo interactivo?

¿Cómo puedo saber (en ~/.bashrc) si estoy ejecutando en modo interactivo o, digamos, ejecutando un comando a través de ssh? Quiero evitar la impresión de secuencias de escape ANSI .bashrcsi es lo último.

Respuesta1

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 de /etc/bash.bashrc y ~/.bashrc, si estos archivos existen.

Por lo tanto, ~/.bashrcsolo se obtiene para shells interactivos. A veces, las personas lo obtienen de ~/.bash_profileo ~/.profileque 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.

Es mejor si no hay salida estándar de rclos archivos de inicio de sesión como ~/.bash_profileo, ~/.profileya que puede interferir con el funcionamiento adecuado de, rsyncpor ejemplo.

En cualquier caso, sigue siendo una buena idea probar la interactividad, ya que puede existir una configuración incorrecta.

Respuesta2

la testherramienta puede verificar esto (desde la página de 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

Respuesta3

Usar:

if tty -s; then echo interactive; fi

Respuesta4

Así lo hace Red Hat... Supongo que es la forma más rápida...

if [ "${-#*i}" == "$-" ]; then

Significa obtener los parámetros de bash, eliminar una subcadena, lo más corto posible, hacer coincidir todo entre el principio y i. Luego verifique si es el mismo que los parámetros de bash originales.

Verifique que hizo su trabajo conectándose con el usuario mediante sftp; fallará si las sesiones no interactivas tienen resultados

información relacionada