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.