GNU/Linux >> Linux Esercitazione >  >> Linux

Automatizzazione dell'input testuale da uno script bash senza utilizzare EOF

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.


Linux
  1. Ottieni il percorso completo da Bash Script?

  2. Rsync ~/foo Target/foo è uguale a Rsync ~/foo/ Target/foo/?

  3. Come sapere se sono in una sessione Tmux da uno script Bash?

  4. Script Bash - Come leggere l'input dell'utente

  5. Pipe da/verso gli appunti nello script Bash

Opzione Rsync sconosciuta dall'esecuzione dello script Bash?

Come posso controllare la sintassi di uno script Bash senza eseguirlo?

Script bash:utilizzo del comando script da uno script bash per la registrazione di una sessione

Automatizzare l'esecuzione del comando su Linux da Windows utilizzando PuTTY

Eseguire lo script bash da un altro script senza attendere il completamento dell'esecuzione dello script?

Come aggiungere un lavoro crontab a crontab usando uno script bash?