2016-06-10 34 views
1

Ich schrieb ein Skript test.shEingabe an einen Dateideskriptor umleiten?

#!/bin/bash 
#test.sh 

echo "This is important message" > /dev/tty 

Wenn ich auf bash

Ausführung versucht
./test.sh 

Dies ist wichtig Nachricht

Ich mag normalerweise keine Nachrichten auf dem Terminal

Okay, der Ausgang ging nie auf die Standardausgabe

Diese wichtige Nachricht

ist, dass ziemlich ärgerlich. Ich mag wirklich nicht ein paar Nachrichten, die absichtlich auf das Terminal geworfen werden. Daher habe ich das getan.

exec 3<> /dev/tty 
./test.sh > /dev/null 3>&1 #Send whatever comes to /dev/tty(3) to /dev/null 

Aber das funktioniert nicht wie erwartet.

Dies ist wichtig Nachricht

Also, was nicht in Ordnung ist? Wie soll ich die Ausgabe verschwinden lassen? Ich möchte wirklich nicht, dass das Skript meine Terminal-Geisel hält.

+3

Warum echote Nachricht an ** tty ** aus dem Skript? Warum nicht diese Zeile nur "echo" Dies ist wichtig Nachricht "' dann Ausgabe von Shell steuern. – Kadir

+0

In einem Skript habe ich 'eval" ./test.sh &>./Test_command.log 'verwendet, um die Ausgabe des Konsolenfensters in die Textdatei' test_command.log' umzuleiten '&' vor deinem '>' Übrigens gibt es eine wirklich gute Erklärung aller Möglichkeiten für die I/O-Umleitung [TLDP-Leitfaden] (http://www.tldp.org/LDP/abs/html/ (io-redirection.html) –

+1

@VladislavMartin Die Ausgabe wird nicht zum Konsolenfenster umgeleitet, das 'eval' ist nicht notwendig und es wird einfach sowohl die Standardausgabe als auch der Standardfehler umgeleitet (beides ist * zuvor * möglich) die Konsole) zu einer Datei. – chepner

Antwort

4
echo "This is important message" > /dev/tty 

das sagt, "-Ausgabe an dem tty". Sie können das Terminal selbst nicht umleiten. Sie müssen stattdessen Ihr Skript ändern.

(Die einzige Möglichkeit, die Ausgabe mit dem Skript zu verhindern, besteht darin, es mit einem steuernden Terminal laufen zu lassen, das nicht ausgibt, zB einem Pseudo-Terminal, dessen Ausgabe vom Master verbraucht wird. Dort aren Ich kenne keine Allzweck-Tools, um dies zu tun siehe unten).

Ihre Frage beinhaltet ein Missverständnis, wie Umleitung funktioniert/was es tut. Die Zeilen, die Sie in der Shell schrieb nicht tun, was Sie scheinen zu denken:

exec 3<> /dev/tty 

Diese leitet die # 3 Dateideskriptor an den Steueranschluss (die normalerweise nicht mit allem, was ohnehin verbunden ist).

./test.sh > /dev/null 3>&1 #Send whatever comes to /dev/tty(3) to /dev/null 

Nein; es sendet, was auch immer an den Dateideskriptor # 3 gerichtet ist, an das aktuelle Ziel des Dateideskriptors # 1 (welches/dev/null ist). Aber das hat keinen Einfluss auf Ihr Skript, das ausdrücklich eine Nachricht an das tty-Gerät sendet (kontrollierendes Terminal, das normalerweise das Terminal wäre, von dem aus Sie den Befehl ausgeführt haben).Insbesondere gibt der echo-Befehl im Skript an stdout (Dateideskriptor # 1) aus, der für diesen Befehl zu /dev/tty, d. H. Dem steuernden Terminal, umgeleitet wird.

socat Mit dem Steuerungsanschluss ändern

Sie können das „socat“ Programm den Steuerungsanschluss an einen Pseudoterminal ändern und den Master-Ausgangs zu/dev/null, mit einer Befehlszeile ähnlichen Umleitung zu die folgenden:

socat EXEC:./test.sh,pty,setsid /dev/null

socat das Programm verbindet eine Eingangsenke/Ausgabequelle zu einem anderen Eingang Enke/Ausgabequelle. In diesem Fall verbindet es die Eingabe/Ausgabe des angegebenen Programms mit/dev/null über ein Pseudoterminal (Option "pty"), das zum steuernden Terminal gemacht wird (Option "setsid").

+0

Es gibt keine Möglichkeit, das Skript zu ändern. Angenommen, es ist mir gegeben. Nur ein Blick hinein offenbart die besagten Linien. –

+0

Auch ich möchte nicht selbst umleiten. Ich möchte alle möglichen Ausgaben umleiten, die an tty gesendet werden. Ist das möglich? –

+0

Was meinen Sie mit "Pseudo-Terminal, dessen Ausgabe vom Master verbraucht wird"? Kannst du es bitte ausarbeiten? –

0

Versuchen Sie, den Dateideskriptor nach/dev/null zu erstellen, echo und schließen Sie den Dateideskriptor.

#!/bin/bash 
#test.sh 

exec 5<> /dev/null 
echo "This is important message" >&5 
exec 5>&- 

Testlauf von Skript und Ergebnisse:

enter image description here

0

Sie können die Ausgabe an eine beliebige virtuelle Konsole umleiten, wenn Sie root Zugriff haben. genau wie dieser.

echo "This is important message" > /dev/tty1