Per quasi tutti i programmi, sia echo $i | myprogram -options
e myprogram -options <<<$i
dovrebbe funzionare, alimentando il programma $i
tramite input standard.
<foo
utilizzerà il contenuto del file denominato foo
come stdin.
<<foo
userà il testo tra questo e una riga composta esclusivamente da foo
come input standard. Questo è un documento qui (heredoc), come disse Gilles; EOF
in realtà non significa la fine del file, è solo un comune delineatore heredoc (usiamo invece "foo" in questo esempio).
<<<foo
utilizzerà la stringa "foo" come input standard. Puoi anche specificare una variabile $foo
, e la shell utilizzerà il suo contenuto come stdin, come ho mostrato sopra. Questa è chiamata herestring , poiché utilizza una stringa corta in contrasto con un intero blocco, come in un heredoc. Le stringhe funzionano in bash, ma non in /bin/sh
.
La sintassi raccomandata da questo sito web è chiamata here document. L'input nel file program inizia immediatamente sotto la riga contenente <<EOF
, e non è terminato dalla fine dello script, ma da una riga contenente esattamente il testo EOF
(fai attenzione a non avere spazi bianchi extra). A proposito, puoi usare qualsiasi indicatore di fine che non contenga alcun carattere speciale della shell:EOF
non è una parola chiave, è semplicemente tradizionale.
#!/bin/bash
for i in {1..100}
do
myprogram -options <<EOF
$i
EOF
for j in {1..42}; do
myprogram2 <<EOF
$i
$j
EOF
done
done
here documenti come menzionato sia da Kevin che da Gilles sopra, o semplici piping funzioneranno in molti casi.
Per situazioni più complicate, potresti voler esaminare Expect o simili (ad esempio il modulo Expect::Simple CPAN è un'implementazione perl molto facile da usare). personalmente, preferisco il modulo perl (Expect stesso è tcl) ma ci sono implementazioni per molti linguaggi di scripting comuni. È anche possibile scrivere un molto implementazione primitiva dell'idea in sh o bash usando while e read.
L'idea generale di Expect e strumenti simili è di attendere una stringa o un modello specificato nell'output di un programma, quindi fornirgli qualsiasi input desiderato.
Un esempio comune di utilizzo è automatizzare l'accesso, "aspettandosi" (cioè aspettando) la stringa "ogin:", inviare il nome di accesso, quindi attendere la stringa "word:" e inviare la password.
Un'ultima opzione, se si dispone del sorgente di myprogram, è semplicemente modificarlo per accettare l'input che si desidera fornirgli come opzione della riga di comando. Questo potrebbe richiedere un po' più di lavoro in anticipo, ma sarà molto meno irritante rispetto a pasticciare con Expect o trasferire i dati in un programma che non è stato progettato per essere utilizzato in quel modo.
... e non dimenticare di inviare la tua patch a myprogram di nuovo a monte :) Anche se non gli piace il modo in cui l'hai codificato, potrebbe apprezzare l'idea abbastanza da aggiungere la funzionalità da soli. Gli sviluppatori a monte tendono ad apprezzare le persone che si alzano e contribuiscono piuttosto che chiedere o lamentarsi.