GNU/Linux >> Linux Esercitazione >  >> Linux

Come reindirizzare l'output di un comando a un file quando il comando richiederà gli input dell'utente?

Per impostazione predefinita, solo STDOUT viene reindirizzato e/o convogliato. Quello che vuoi è lasciare STDOUT da solo e avere tutto ciò che viene passato tramite STDIN reindirizzato.

Se modifichi the_command è un'opzione, puoi assicurarti che la domanda venga inviata a STDERR invece (che dovrebbe scaricarlo sullo schermo indipendentemente da eventuali reindirizzamenti), e quindi farlo riecheggiare qualunque cosa l'utente digiti sullo schermo tramite STDOUT .


Il tuo comando funziona e reindirizza correttamente l'output al file abc.txt .
La domanda è in che modo il tuo script richiede i dati di input e come stai eseguendo lo script?
Vediamolo con due esempi:

# Script_1.sh                                     # 1
echo Please, enter your firstname and lastname    # 2
read FN LN                                        # 3
echo "Hi! $LN, $FN !"                             # 4

e

# Script_2.sh                                     # 5
read -p "Enter a comment " CM                     # 6
echo  "You said $CM"                              # 7

Se esegui /bin/bash Script1.sh > abc.txt non vedrai la domanda "Inserisci..." sul tuo tty. Se darai l'input previsto dalla tastiera troverai l'output della riga #2 e #4 nel tuo abc.txt file.

Se esegui /bin/bash Script2.sh > abc.txt vedrai la domanda "Inserisci un commento ", ma la troverai nel abc.txt file solo l'output della riga #7.

Nota:se esegui Script2,sh in una subshell

(bash Script2.sh 2>&1)> abc.txt

non vedrai alcun output su tty e troverai tutto in abc.txt file.
Se lo esegui con

bash Script2.sh 2>ccc.txt 1>ddd.txt`

troverai l'output standard (riga #7) in ddd.txt e l'errore standard (riga #6) in ccc.txt .

Se vuoi reindirizzare solo una parte dell'output del tuo comando devi modificare il tuo script.
Uno dei modi per farlo è creare una funzione in cui spostare la parte dello script che genererà l'output interessante (vedi sotto). Quindi puoi chiamare questa funzione dalla parte principale del tuo script (dove era originariamente il codice che hai spostato nella funzione) reindirizzando solo quell'output al file di log:

 Part_To_Redirect(){
     : # all that you want
 }

 # ... Main part of the script
 # point where it was the part that generates the output
 Part_to_Redirect "[email protected]" > abc.txt   # this to store only that part in the file
 # Part_to_Redirect "[email protected]" >> abc.txt  # this to append that part in the file
 # ...

Dovresti anche trovare utile tee che

reindirizza l'output a più file, copia lo standard input nello standard output e anche a qualsiasi file fornito come argomento.

 the_command  | tee abc.txt       # To redirect Standard output
 or 
 the_command 2>&1 | tee abc.txt   # To redirect err in out and both in the file

In questo caso avrai i normali output del tuo comando sulla tty, ma allo stesso tempo ne salverai una copia nel file di log abc.txt . Dovrebbe essere accogliente nel tuo caso se usi read -p come nello script2 l'invocazione the_command | tee abc.txt .

Note e riferimenti:

Aggiunta di "[email protected]" puoi passare tutti gli argomenti del tuo script alla funzione.

Potresti trovare interessante leggere di più su bashredirection da molte fonti su Internet.

  • Come suggerito da Scott nel suo commento, esiste una risposta wiki di Unix SE:un buon punto di partenza.
  • Imperdibile il man bash o il manuale di bash.
  • Ho trovato utile il capitolo sul reindirizzamento di bash-hackers dove puoi trovare anche collegamenti a usi obsoleti.
  • Puoi fare riferimento anche alla Advanced Bash-Scripting Guide, capitolo 20.

Linux
  1. Come reindirizzare l'output su un file e Stdout in Linux

  2. Come reindirizzare l'output di un programma su un file zip?

  3. Come aggiungere l'output a un file?

  4. Come reindirizzare l'output di system() su un file?

  5. Come reindirizzare l'output del comando time su un file in Linux?

Come utilizzare il comando usermod in Linux

Come utilizzare il comando touch in Linux

Come utilizzare il comando head di Linux

Come usare il comando diff di Linux

Come reindirizzare l'output del comando della shell

Come salvare l'output del comando in un file utilizzando il terminale Linux