Umleiten von Shell-Befehlsausgaben an eine andere Konsolen-Shell


4

Ich schreibe ein Shell-Skript und möchte Befehle in das Skript schreiben, aber die Ausgabe auf andere Konsolensitzungen umleiten. (mit kde)

linux  bash  shell  unix 

Antworten:


4

Suchen Sie zunächst nach der Nummer, die die aktuelle Sitzung identifiziert. Betrachten wir die Zahl als X:

| terminal 1               | terminal 2                |
 ------------------------------------------------------
| $ tty                    | $                         |
| /dev/pts/X               |                           |

Verwenden Sie dann die angegebene Nummer, um in das ausgewählte tty zu schreiben:

| terminal 1               | terminal 2                |
 ------------------------------------------------------
| $ tty                    | $ echo "foo" > /dev/pts/X |
| /dev/pts/X               |                           |

Und es wird produzieren:

| terminal 1               | terminal 2                |
 ------------------------------------------------------
| $ tty                    | $ echo "foo" > /dev/pts/X |
| /dev/pts/X               |                           |
| foo                      |                           |

3

Sie können die Ausgabe an eine Protokolldatei weiterleiten, die von anderen Sitzungen überwacht wird.

In jedem anderen Terminal:

touch foo && tail -f foo

Im "Haupt" Terminal:

script.sh > foo

0

Ausgabe des Terminals in eine Datei statt des Terminals drucken, in dem Sie sich befinden:

commands >>outputfile

Verwenden Sie in einem neuen Terminal tail, um den Inhalt der Ausgabedatei anzuzeigen und automatisch zu aktualisieren, wenn weiterer Text hinzugefügt wird:

tail -f outputfile

0

Spät aber vielleicht besser als nie ... :-)

mkfifo ~/MyOutput           # Create the FIFO (Special file) 

./MyScript.sh > ~/MyOutput  # In the terminal/console 1
cat ~/MyOutput              # In another tty/console

von info coreutils 'mkfifo invocation':

Ein "FIFO" ist ein spezieller Dateityp, mit dem unabhängige Prozesse kommunizieren können. Ein Prozess öffnet die FIFO-Datei zum Schreiben und ein anderer zum Lesen, wonach Daten wie bei der üblichen anonymen Pipe in Shells oder anderswo fließen können.

Randnotizen:

  • Es ist besser, das FIFO nicht in deinem Homeverzeichnis anzulegen :-)
  • Sie können mehr als eine FIFOfür den gleichen Prozess haben (std out, std err).
  • Solange Sie keinen Speicherauszug anfordern FIFOs, wird die gesamte Ausgabe gespeichert .
    Wie Sie das erste Mal fragen, wird es auszuspülen alle.
  • Sie können zu einer anderen Datei umleiten (oder diese anhängen) cat MyOutput >> NewRealFile
  • Sie können auch cat MyOutputvon einem anderen Terminal aus verwenden!
  • Achtung : Wenn Sie zu einem 2 diffent Programmen stellen (oder Instanzen) Ausgabe an den gleichen umleiten FIFOsdes Fluss wird (nicht zusammengeführt werden a priori Art und Weise aus dem Programm zu unterscheiden , die Linie herkommt).
  • Warnung : Wenn Sie zwei- oder mehrmal fragen (möglicherweise von verschiedenen Terminals), wird für jede Anforderung eine Zeile ausgegeben, die die Ausgabe an den Anforderer aufteilt.
  • Es kann komplexere Verwendungszwecke haben: Wie kann ein Programm ordnungsgemäß gestartet und die laufende Ausgabe (stdout und stderr) zu einem späteren Zeitpunkt umgeleitet werden?

0

Verwenden Sie den ttyBefehl in jedem Terminal, um sie zu identifizieren:

$ tty
/dev/pts/0

$ tty
/dev/pts/1

Angenommen, diese TTYs leiten die Standardausgabe der ersten auf die zweite um. Führen Sie dies im ersten Terminal aus:

exec 1>/dev/pts/1

Hinweis: Jetzt wird jede Befehlsausgabe auf pts / 1 angezeigt

So stellen Sie das Standardverhalten stdout von pts / 0 wieder her:

exec 1>/dev/pts/0

In diesem Video sehen Sie eine Demonstration.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.