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 "example@unixlinux.online" > abc.txt # this to store only that part in the file
# Part_to_Redirect "example@unixlinux.online" >> 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 "example@unixlinux.online" 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 basho 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.