GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann die Ausgabe eines Befehls in eine Datei umgeleitet werden, wenn der Befehl Benutzereingaben auffordert?

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

ausführen
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.

Linux
  1. Wie weist man die Ausgabe eines Befehls einer Shell-Variablen zu?

  2. Wie leite ich die Ausgabe eines Programms in eine Zip-Datei um?

  3. Wie erfasst man die Ausgabe eines Top-Befehls in einer Datei unter Linux?

  4. Wie kann die Ausgabe des Zeitbefehls in eine Datei unter Linux umgeleitet werden?

  5. Wie speichere ich die Ausgabe dieses awk-Befehls in einer Datei?

So verwenden Sie den usermod-Befehl unter Linux

So verwenden Sie den Touch-Befehl unter Linux

So verwenden Sie den Linux-Kopfbefehl

So verwenden Sie den Linux-diff-Befehl

So leiten Sie die Shell-Befehlsausgabe um

So speichern Sie die Ausgabe des Befehls in einer Datei mit dem Linux-Terminal