it-swarm.com.de

Beispiel für eine Konsolenausgabe, die nicht in die Standardausgabe geschrieben wird

Es scheint, dass read nicht in die Standardausgabe schreibt.

 $ cat test.sh 
 #!/bin/bash 
 read -p "Schlüssel eingeben und" key 
 echo "der Schlüssel war $ key" 
 $ ./test.sh[.____.)Tippen Sie einen Schlüssel und Enterx 
 Der Schlüssel war x 
 $ ./test.sh | tee file 
 geben Sie einen Schlüssel ein und Enterx 
 der Schlüssel war x 
 $ cat file 
 der Schlüssel war x 

Ich versuche es ohne Skript ...

 $ read -p "Geben Sie einen Schlüssel ein und drücken Sie die Eingabetaste | tee file 
 Schlüssel eingeben und Enterx 
 $ cat file 
 $ 

Der Befehl read wird beschrieben hier . Eine kurze Beschreibung: "Eine Zeile von der Standardeingabe lesen".

Informationen zur Pfeife, |, from The Linux Command Line (2. Internet Edition) von William E. Shotts folgt.

Verwenden des Pipe-Operators "|" (vertikaler Balken) kann die Standardausgabe eines Befehls an die Standardeingabe eines anderen Befehls weitergeleitet werden: command1 | command2

Auf der Manpage für tee steht diese Beschreibung:

lesen Sie von der Standardeingabe und schreiben Sie in die Standardausgabe und Dateien

Die Manpage für tee ist hier link .

Wo befindet sich die Liste aller anderen Beispiele von Programmen, die auf die Konsole schreiben, aber tatsächlich keine Standardausgabe verwenden, oder wo befindet sich die allgemeine Regel, um zu wissen, wann ein Programm, das auf die Konsole schreibt, dies nicht tut Standardausgabe verwenden?

Es scheint, read verletzt das Prinzip des geringsten Erstaunens .

2
H2ONaCl

In Ihrem Beispiel schreibt read in stderr anstelle von stdout. Hier ist, wie ich weiß:

 $ read -p "Geben Sie einen Schlüssel ein und drücken Sie die Eingabetaste:" key>/dev/null 
 Geben Sie einen Schlüssel ein und drücken Sie die Eingabetaste: x 
 $ read -p "Geben Sie einen Schlüssel ein und drücken Sie die Eingabetaste: "Taste 2>/dev/null 
 x 

Sie können diesen Test mit jedem Programm durchführen, dessen Ausgabe Sie umleiten möchten.

Der gesuchte Befehl lautet also:

 $ read -p "Geben Sie eine Taste ein und drücken Sie die Eingabetaste:" Taste 2> & 1 | tee file 
 Geben Sie einen Schlüssel ein und drücken Sie die Eingabetaste: x 
 $ cat file 
 Geben Sie einen Schlüssel ein und drücken Sie die Eingabetaste: $ 

Erläuterungen zu den obigen Weiterleitungen:

6
wjandrea

Mit dem, was wjandrea gesagt hat, ist es richtig, dass Sie das stderr nehmen können, das gerade gelesen wird. Leider behält der Versuch, mit stderr einzulesen, die Variable von key nicht bei, sodass die Ausgabe für echo $key Leer bleibt. In einem Skript wird die Variable jedoch beibehalten, da die Lesezeile selbst nicht von stderr nach stdout2>&1 Im Skript umgeleitet wird. Stattdessen behält das Skript die Variable bei, da sie jetzt festgelegt ist, bevor sie umgeleitet wird. Ich denke, um es einfacher zu machen, benutze stattdessen echo Zeilen. Ich habe alle Beispiele hinzugefügt.

Beispiel Ihres Skripts:

:~$ cat test1.sh 
#!/bin/bash
read -p "type a key and Enter: " key
echo "the key was $key"

:~$ ./test1.sh | tee junk
type a key and Enter: G
the key was G

:~$ cat junk
the key was G

Mit 2>&1 Umleitung:

:~$ ./test1.sh 2>&1 | tee junk
type a key and Enter: G
the key was G

:~$ cat junk
type a key and Enter: the key was G

Mit echo Zeile:

:~$ cat test.sh 
#!/bin/bash
echo -n "Type a key and press Enter: "
read key
echo "the key was $key"

echo Zeile mit tee Befehl:

:~$ ./test.sh | tee junk
Type a key and press Enter: X
the key was X

:~$ cat junk
Type a key and press Enter: the key was X

Beispiel für das no-Skript:

Mit stderr:

:~$ read -p "Type a key and press Enter: " key 2>&1 |tee junk; echo "The key was $key" | tee -a junk
Type a key and press Enter: F
The key was 

:~$ cat junk
Type a key and press Enter: The key was 

Stattdessen mit echo und mehreren tee-Befehlen:

:~$ echo -n "Type a key and press Enter: " | tee junk; read key; echo "The key was $key" | tee -a junk
Type a key and press Enter: F
The key was F

:~$ cat junk
Type a key and press Enter: The key was F

Hoffe das hilft!

1
Terrance