Sto scrivendo uno script di shell POSIX che può o non può ricevere input da stdin (come in foo.sh < test.txt
, non in modo interattivo). Come posso verificare se c'è qualcosa su stdin, per evitare l'arresto su while read -r line...
?Rileva presenza di contenuto di stdin nello script di shell
risposta
Se avrò la giusta domanda, si può provare il seguente:
#!/bin/sh
if [ -t 0 ]; then
echo running interactivelly
else
while read -r line ; do
echo $line
done
fi
Solo un avviso, questo viene attivato per lo stdin e quando si acquisisce lo stdout. (entrambi gestiscono interactivelly) ./yourscript <./the_input_your_giving_your_script.txt && ./yourscript> ./what_your_script_outputs.txt – DebugXYZ
@DeShawnWilliams No, la risposta di @dmedvinsky è corretta: 'test -tn' è true se il descrittore di file' n' è aperto su un terminale, quindi 'test -t 0' controlla solo lo stdin e' test -t 1 'controlla solo lo stdout. – bootleg
Se non si desidera eseguire lo script in modo interattivo, farlo prendere il file di input come parametro anziché utilizzare stdin
. Alcuni programmi usano un flag o un nome file speciale per indicare che dovrebbero prendere input da input standard piuttosto che da un file; quel caso ti permette di gestire il jockey a linea di comando se necessario.
Se si desidera che lo script prenda l'input standard, perché non si desidera che sia interattivo (o almeno si comporti come gli altri strumenti POSIX)?
Un modo comune per dire ai programmi di leggere da stdin di un file è quello di fornire '-' invece di un nome di file. – Cascabel
si può facilmente implementare un comportamento simile a quello del comando "cat", che viene letto da un elenco di file forniti o se Non sono fornite, quindi leggere dallo stdin.
Anche se non è possibile utilizzare questa idea, credo che questo articolo Linux Journal sarà interessante per voi http://www.linuxjournal.com/content/determine-if-shell-input-coming-terminal-or-pipe
:-)
di rispondere alla domanda letteralmente (ma non quello che realmente vuole): read -t 0
Timeout, zero secondi.
- questa è una condizione di gara, a seconda di quando il lato sinistro è pronto a fornire i dati. È possibile specificare
-t 5
ma su un sistema di thrashing anche questo è problematico. read -t
non è standardizzato in SUSv3. È in BSD sh, bash, zsh. Non è in ksh o dash.
Quindi non si può semplicemente usare #!/Bin/sh e aspettarsi di avere questo.
Il problema di base è che anche se non c'è nulla su stdin ora, ciò non significa che non ci sarà presto. Invocare un programma normalmente lascia lo stdin connesso al terminale/qualunque cosa, quindi non c'è modo di dire cosa è necessario.
Quindi, per rispondere alla tua domanda, letteralmente, si può fare, ma in pratica le opzioni sono:
- test se stdin è un tty:
[ -t 0 ]
- uso argv per controllare il comportamento
Ho appena sperimentato questo usando zsh. Ho notato che 'read -t' o equivalentemente' read -t0' hanno un comportamento ** non deterministico **. Quindi, come hai già detto, evita di usarlo. – Tarrasch
Ma, questo deve essere distinto dal _test_ '-t' usato nella risposta. –
- 1. Aggiungere contenuto di utilizzo nello script della shell senza getopts
- 2. addEventListener nello script di contenuto non funzionante
- 3. Registrazione di prefissi con la data nello script di shell
- 4. Controllare l'output di un comando nello script di shell
- 5. argomento di passaggio che contiene spazio nello script di shell
- 6. Come ottenere l'estensione di un file nello script di shell
- 7. Crea o variabili di shell nello script Linker
- 8. Qual è la differenza tra $ @ e $ * nello script di shell?
- 9. Condizioni multiple nello script della shell di istruzioni if
- 10. Tempo di incremento (minuti e secondi) nello script bash/shell
- 11. Esegui un singolo comando nello script di shell senza sudo
- 12. Come recuperare tutti gli strumenti utilizzati nello script di shell
- 13. Modifica per utente root nello script di shell
- 14. Una riga if/else condition nello script di shell linux
- 15. argomento non valido per l'opzione '-resize' nello script di shell
- 16. Che cosa $? $ 0 $ 1 $ 2 significa nello script di shell?
- 17. come leggere un singolo carattere nello script di shell
- 18. come manipolare la matrice nello script di shell
- 19. Operazione temporanea in una directory temporanea nello script di shell
- 20. Parsing JSON nello script di shell con regex
- 21. se istruzione per controllare $ HOSTNAME nello script di shell
- 22. SSH: non richiede la password nello script di shell
- 23. esportazione non funziona nello script shell
- 24. Elaborazione o threading parallelo nello script Shell
- 25. L'impostazione della variabile di ambiente nello script di shell non lo rende visibile alla shell
- 26. l'ordinamento in script di shell
- 27. Eliminazione del contenuto della cartella con script di shell
- 28. Che cos'è usage() nello scripting di shell?
- 29. script di shell: if
- 30. Shell array di script
stdout: http://stackoverflow.com/questions/911168/how-to-detect-if-my-shell-script-is-running- through-a-pipe –