Der Unterschied ist, dass Sie zwei verschiedene und (von Perl und Ihr Programm Sicht) unabhängige Datei-Handles schreiben.
Die erste ist eine Datei-Handle zu einer speziellen „device“ Datei auf Unixy OS geöffnet, die „für den Steueranschluss eines Prozesses ein Synonym, falls vorhanden“ ist (Zitat aus this Linux document). Bitte beachten Sie, dass, während es allgemein als "Bildschirm" betrachtet wird, es nicht sein muss (z. B. könnte das Terminal stattdessen mit der Gerätedatei eines seriellen Ports verknüpft sein); und es kann nicht existieren oder nicht geöffnet werden.
Der zweite ist eine Datei, die standardmäßig mit dem Dateideskriptor # 1 für den Prozess verknüpft ist.
Sie scheinen mag auf den ersten Blick identisch sein aufgrund der Tatsache, dass in einer typischen Situation, ein Unix-Shell wird standardmäßig 1 seinen Dateideskriptor # assoziieren (und damit ein jeder Prozess ohne Umleitungen startet) mit /dev/tty
.
Die beiden haben nichts gemeinsam von Perl Sicht, ANDERE als die Tatsache, dass diese beiden am Ende aufgrund der Art, wie Unix-Shells standardmäßig funktionieren.
Das funktionale Verhalten der beiden zitierten Codeabschnitte wird aufgrund dieser Vorgabe oft identisch aussehen, aber das ist nur "zufällig".
Unter praktischen Unterschiede:
/dev/tty
nicht unbedingt existieren auf nicht-Unixy oss. Es ist daher sehr un portabel, um tty zu verwenden. Windows entspricht CON:
IIRC.
STDOUT
eines Programms kann von jedem, der das Programm aufgerufen hat, mit ALLEN verknüpft werden. Könnte einer Datei zugeordnet sein, könnte eine Pipe zum STDIN eines anderen Prozesses sein.
Sie können überprüfen, ob Ihr STDOUT an einen tty verbunden ist durch die Verwendung von -t
operator:
if (-t STDOUT) { say 'STDOUT is connected to a tty' }
Als weiteren beiseite, bitte beachten Sie, dass Sie sicherstellen können, dass Ihr STDOUT schreibt /dev/tty
indem das STDOUT-Dateihandle explizit geschlossen und erneut geöffnet wird, so dass es auf /dev/tty
zeigt:
Einer schreibt an/dev/tty, einer von ihnen schreibt an STDOUT. Wolltest du das wissen? –
@JB - es ist keine triviale Unterscheidung für Leute, die mit Unix nicht sehr vertraut sind – DVK
@DVK Sie haben Recht. Ich war verwirrt von der Perl-Orientierung der Frage, als der Kern davon Unix war. Danke für die Aufklärung! –