Standardmäßig nur STDOUT
umgeleitet und/oder geleitet wird. Sie möchten STDOUT
verlassen allein, und haben, was auch immer über STDIN
übergeben wird umgeleitet.
Beim Bearbeiten von the_command
eine Option ist, könnten Sie dafür sorgen, dass die Frage auf STDERR
ausgegeben wird stattdessen (das sollte es unabhängig von Umleitungen auf dem Bildschirm ausgeben) und es dann über STDOUT
wiedergeben lassen, was auch immer der Benutzer auf den Bildschirm eingibt .
Ihr Befehl funktioniert und leitet die Ausgabe ordnungsgemäß in die Datei abc.txt
um .
Die Frage ist, wie fragt Ihr Skript die Eingabedaten ab und wie führst du das script aus?
Lassen Sie uns anhand von zwei Beispielen sehen:
# Script_1.sh # 1
echo Please, enter your firstname and lastname # 2
read FN LN # 3
echo "Hi! $LN, $FN !" # 4
und
# Script_2.sh # 5
read -p "Enter a comment " CM # 6
echo "You said $CM" # 7
Wenn Sie /bin/bash Script1.sh > abc.txt
ausführen Sie werden die Frage "Bitte eingeben..." auf Ihrem TTY nicht sehen. Wenn Sie die erwartete Eingabe über die Tastatur machen, finden Sie die Ausgabe von Zeile #2 und #4 in Ihrem abc.txt
Datei.
Wenn Sie /bin/bash Script2.sh > abc.txt
ausführen Sie werden die Frage "Geben Sie einen Kommentar ein" sehen, aber Sie werden in der abc.txt
finden file nur die Ausgabe der Zeile #7.
Hinweis:Wenn Sie Script2 ausführen, sh in einer Subshell
(bash Script2.sh 2>&1)> abc.txt
Sie werden keine Ausgabe auf tty sehen und Sie werden alles in abc.txt
finden Datei.
Wenn Sie es mit
bash Script2.sh 2>ccc.txt 1>ddd.txt`
Sie finden die Standardausgabe (Zeile #7) in ddd.txt
und der Standardfehler (Zeile #6) in ccc.txt
.
Wenn Sie nur einen Teil Ihrer Befehlsausgabe umleiten möchten Sie müssen Ihr Skript ändern.
Eine Möglichkeit, dies zu tun, besteht darin, eine Funktion zu erstellen, in der der Teil des Skripts verschoben wird, der die interessante Ausgabe generiert (siehe unten). Dann können Sie diese Funktion aus dem Hauptteil aufrufen Ihres Skripts (wobei es sich ursprünglich um den Code handelte, den Sie in die Funktion verschoben haben), indem Sie nur diese Ausgabe in die Protokolldatei umleiten:
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
# ...
Sie sollten sogar tee
nützlich finden das
leitet die Ausgabe in mehrere Dateien um, kopiert die Standardeingabe in die Standardausgabe und auch auf alle als Argumente angegebenen Dateien.
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 diesem Fall haben Sie die normalen Ausgaben Ihres Befehls auf dem tty, aber gleichzeitig speichern Sie eine Kopie in der Protokolldatei abc.txt
. In Ihrem Fall sollte es gemütlich sein, wenn Sie read -p
verwenden wie im script2 der Aufruf the_command | tee abc.txt
.
Hinweise und Referenzen:
Hinzufügen von "[email protected]"
Sie können alle Argumente Ihres Skripts an die Funktion übergeben.
Vielleicht finden Sie es interessant, mehr über Bashredirection aus vielen Quellen im Internet zu lesen.
- Wie von Scott in seinem Kommentar vorgeschlagen, gibt es eine Wiki-Antwort von Unix SE:ein guter Ausgangspunkt.
- A muss
man bash
sein oder das Bash-Handbuch. - Ich fand das Redirection-Kapitel von bash-hackers nützlich, wo Sie auch Links zu veralteten Verwendungen finden können.
- Sie können sich auch auf Kapitel 20 des Advanced Bash-Scripting Guide beziehen.