¿Cómo comprobar si la entrada estándar es desde el terminal o una tubería en un script de shell?

StackOverflow https://stackoverflow.com/questions/2456750

  •  20-09-2019
  •  | 
  •  

Pregunta

Estoy escribiendo un script de shell POSIX que pueden o no pueden recibir la entrada de la entrada estándar como en foo.sh < test.txt, no interactiva.

¿Cómo puedo comprobar si hay algo en la entrada estándar, para evitar la detención de while read -r line...?

¿Fue útil?

Solución

Si consigo la pregunta correcta, puede intentar lo siguiente:

#!/bin/sh
if [ -t 0 ]; then
    echo running interactivelly
else
    while read -r line ; do
        echo $line
    done
fi

Otros consejos

Para responder a la pregunta, literalmente, (pero no lo que realmente quiere): read -t 0

Timeout, cero segundos.

  1. esta es una carrera de condiciones, dependiendo de cuando la mano del lado izquierdo está dispuesta a proporcionar datos. Puede especificar -t 5 pero en un sistema golear incluso que es problemático.
  2. read -t no ha sido estandarizada en SUSv3. Es en BSD sh, bash, zsh. No está en ksh o un guión.

Así que no se puede simplemente usar #! / Bin / sh y esperar a tener esto.

El problema básico es que incluso si no hay nada en la entrada estándar ahora, eso no quiere decir que no habrá pronto. La invocación de un programa normalmente hojas de entrada estándar conectado al terminal / lo que sea, así que no hay manera de saber lo que se necesita.

Así que, para responder a su pregunta, literalmente, puede hacerlo, pero en la práctica sus opciones son:

  1. prueba si la entrada estándar es un tty: [ -t 0 ]
  2. argv uso para controlar el comportamiento

Se puede implementar fácilmente un comportamiento similar al del comando "cat", que se lee de una lista de archivos proporcionados o si no están provistos, a continuación, leer desde la entrada estándar.

A pesar de que no puede usar esta idea, creo que este artículo de Linux Journal será interesante para usted http://www.linuxjournal.com/content/determine-if-shell-input-coming-terminal-or-pipe

: -)

Si no desea ejecutar el script de forma interactiva, que se necesita el archivo de entrada como un parámetro, en lugar de utilizar stdin. Algunos programas utilizan una bandera o un nombre de archivo especial para indicar que debe tomar la entrada de la entrada estándar en lugar de partir de un archivo; ese caso le permite manejar la línea de comandos maniobrando si es necesario.

Si desea que su script para tomar la entrada estándar, ¿por qué no quiere dejar que sea interactivo (o al menos se comporta como otras herramientas POSIX)?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top