Estoy escribiendo un script de shell POSIX que puede o no recibir entrada de stdin (como en foo.sh < test.txt
, de forma no interactiva). ¿Cómo compruebo si hay algo en stdin para evitar detenerme en while read -r line...
?Detectar la presencia de contenido stdin en el script de shell
Respuesta
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
Solo un aviso, esto se activa para stdin y cuando se captura la salida estándar. (ambos se ejecutan interactivelly) ./yourscript <./the_input_your_giving_your_script.txt && ./yourscript> ./what_your_script_outputs.txt – DebugXYZ
@DeShawnWilliams No, la respuesta de @dmedvinsky es correcta: 'test -tn' es verdadero si el descriptor de archivo' n' se abre en un terminal, por lo tanto 'test -t 0' solo busca stdin, y' test -t 1 'solo verifica el stdout. – bootleg
Si no desea ejecutar el script de forma interactiva, haga que tome el archivo de entrada como un parámetro, en lugar de usar stdin
. Algunos programas usan una bandera o un nombre de archivo especial para indicar que deben tomar la entrada desde la entrada estándar en lugar de desde un archivo; ese caso te permite manejar maniobras de línea de comando si es necesario.
Si desea que su script tome la entrada estándar, ¿por qué no quiere que sea interactivo (o al menos se comporte como otras herramientas POSIX)?
Una forma común de decirle a los programas que lean de stdin en su lugar de un archivo es proporcionar '-' en lugar de un nombre de archivo. – Cascabel
que se pueden implementar fácilmente un comportamiento similar al del comando "cat", que se lee de una lista de archivos proporcionados o si no se proporciona, luego lee del stdin.
Aunque usted no puede utilizar 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
:-)
Para responder a la pregunta, literalmente, (pero no lo que realmente quiere): read -t 0
Tiempo de espera, cero segundos.
- esto es una condición de carrera, dependiendo de cuando el lado izquierdo está listo para proporcionar datos. Puede especificar
-t 5
pero en un sistema de agolpamiento incluso eso es problemático. read -t
no está estandarizado en SUSv3. Está en BSD sh, bash, zsh. No está en ksh o dash.
Así que no puedes usar #!/Bin/sh y esperar tener esto.
El problema básico es que incluso si no hay nada en stdin ahora, eso no significa que no habrá pronto. Invocar un programa normalmente deja stdin conectado a la terminal/lo que sea, por lo que no hay forma de saber qué se necesita.
lo tanto, para responder a su pregunta, literalmente, puede hacerlo, pero en la práctica sus opciones son:
- prueba si la entrada estándar es un tty:
[ -t 0 ]
- uso argv para controlar el comportamiento
Acabo de experimentar con esto usando zsh. Noté que 'read -t' o equivalente' read -t0' tienen un comportamiento ** no determinista **. Como ya lo mencionaste, evita usarlo. – Tarrasch
Pero eso debe distinguirse del _test_ '-t' utilizado en la respuesta. –
- 1. ¿Cómo puedo redireccionar stdin desde un script de shell a un comando en el script de shell?
- 2. Ejecutar script de shell utilizando texto de script de fabric y de canal en stdin de shell
- 3. Cómo detectar la presencia de cierto dispositivo
- 4. leer el contenido de un directorio utilizando script de shell
- 5. ¿Cómo detectar la presencia de hardware en el teclado?
- 6. COMO: Detectar fiesta del shell script
- 7. Algoritmo para detectar la presencia de texto en la imagen
- 8. Creación de archivos con algún contenido con script de shell
- 9. utilizando o en el script de shell script de
- 10. Eliminación del contenido de la carpeta con el script de shell
- 11. ¿Qué significa "$$" en el script de shell?
- 12. ¿Cómo detectar el directorio actual en el que ejecuto mi script de shell?
- 13. Detectar presencia de plantilla en tiempo de compilación
- 14. ¿Cómo se puede verificar la entrada de STDIN en un script de Ruby?
- 15. Prueba de script Shell
- 16. script de shell: if
- 17. de clasificación en shell script
- 18. node.js: ¿Cómo detectar una secuencia stdin vacía?
- 19. ¿Cómo detectar presencia y ubicación de JVM en Windows?
- 20. SSH: No solicite la contraseña en el script de shell
- 21. cómo manipular la matriz en el script de shell
- 22. Extensión de Chrome: ¿cómo detectar que el script de contenido ya está cargado en una pestaña?
- 23. Entrada desde el script de shell
- 24. OpenSSL crear hash SHA desde shell stdin
- 25. plantillas de script de shell
- 26. ¿Cómo convertir contenido STDIN a una matriz?
- 27. Script de shell: compruebe la sintaxis
- 28. Un buen método para detectar la presencia de una característica en particular en una imagen
- 29. Delphi: ¿cómo puedo detectar la presencia del software antivirus?
- 30. ¿Cómo puedo detectar una presencia en la barra de desplazamiento (usando Javascript) en HTML iFrame?
stdout: http://stackoverflow.com/questions/911168/how-to-detect-if-my-shell-script-is-running-through-a-pipe –