Opciones de bash y shells interactivos

La opción -s para bash no parece hacer nada realmente

Cuando ejecuto comandos con o sin él, nada cambia. Lo que realmente me confunde es cuando ejecuto un script de shell, siempre parece que obtengo un shell interactivo. Supongo que es interactivo porque cuando uso la lectura incorporada en el script, siempre me pedirá ¿Esto lo hace interactivo?

¿El script de shell se ejecuta como interactivo en Fedora, y hay algún ejemplo de una diferencia que los -s puedan hacer? He leído las páginas del manual, pero no puedo parece generar ejemplos por mi cuenta que tendrían algún efecto. Combiné las dos preguntas porque estaba tratando de usar s para cambiar la forma en que el guión recibió la entrada, y en algunos tutoriales dicen que tiene un efecto. Me doy cuenta de que puede establecer argumentos, lo que no entiendo es cómo lo cambia para leer desde la entrada estándar, siempre parece hacerlo de todos modos

Esto es lo que usé para probarlo

if [ -v $PS1 ] then echo non-interactive else echo interactive fi read ; echo $REPLY 

read siempre pudo funcionar tanto en shells interactivos como no interactivos

Incluso cuando probé la presencia de fd / 0 y fd / 1 en shells no interactivos que todavía existían

Gracias de antemano

Responder

Bash también determinará si o no es interactivo al examinar si su entrada / salida está conectada a una terminal.

El interruptor -s no interactivo permite que el script bash procese parámetros posicionales cuando leer comandos de un archivo. Por ejemplo:

$ cat demo.sh echo "$0 = " $0 echo "$1 = " $1 echo "$2 = " $2 $ bash < demo.sh foo bar bash: foo: No such file or directory $ bash -s < demo.sh foo bar $0 = bash $1 = foo $2 = bar 

Responder

El -s hace que bash lea los comandos de su entrada estándar. Sin esta opción, bash trata su primer argumento como el nombre de un script a ejecutar. Con esto opción, bash trata todos sus argumentos como argumentos del script que lee en la entrada estándar. La opción -s solo determina cómo bash interpreta sus argumentos de línea de comando, no si la instancia de shell es interactiva.

Una instancia de bash siempre es interactiva si se inicia con la opción -i. Sin -i, es interactivo solo si no se pasa ningún nombre de secuencia de comandos (-s influye en esto) y tanto la entrada estándar como el error estándar están conectados a una terminal.

Probar PS1 no le dice si una instancia de shell es interactiva.¹ Puede desarmar PS1 en un shell interactivo. Por el contrario, un shell no interactivo a menudo hereda PS1 de su entorno. La forma confiable de probar si el shell se está ejecutando de manera interactiva es probar si $- contiene i.

El read incorporado funciona desde cualquier shell, interactivo o no. Lee lo que esté conectado a la entrada estándar del shell (a menos que sea redirigido). Si intentas leer desde el mismo descriptor de archivo donde bash está leyendo el script que está ejecutando, terminarás saltando una línea en el script. (no necesariamente en el lugar que deseaba); por ejemplo, si «está pasando un script en la entrada estándar de bash» y desea leer una línea desde la terminal, debe redirigir el read llamar: read line </dev/tty.

Los descriptores de archivo 0, 1 y 2 siempre existen (a menos que «se hayan cerrado); son entrada estándar, salida estándar y error estándar respectivamente. Si el shell es interactivo o no no está relacionado con lo que apuntan los descriptores estándar, excepto que si fd 0 y 2 son terminales influye en el estado interactivo del shell.

¹ Sí, yo «m consciente de que hay páginas web que así lo afirman. Están equivocados.

Respuesta

Un poco más de información sobre shells interactivos:

Puede averiguar si un shell es interactivo o no marcando $-. Si $- contiene un i, entonces el shell es interactivo.

Un shell es interactivo cuando lee la entrada del usuario directamente. Un shell no interactivo lee los comandos de un archivo línea por línea y los ejecuta. no hace que el shell sea interactivo al leer algo de stdin desde dentro del script, ya que «el script lee la entrada, no el shell» (no sé cómo explicar esto mejor).

 labdebian# cat ./test #!/bin/bash echo Hello World echo $- read; echo $REPLY echo $- labdebian# bash test Hello World hB I"m typing this I"m typing this hB labdebian# bash -i test Hello World himB I"m typing this I"m typing this himB 

Comentarios

  • Lo que era confuso es que en la documentación de bash dicen que se bloqueará si usa read en un shell interactivo

Respuesta

-s no hace que su shell interactivo. Utilice -i en su lugar.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *