Wenn für einen Befehl -
anstelle eines Dateinamens ein Argument verwendet wird, bedeutet dies STDIN oder STDOUT.
In diesem Beispiel wird jedoch eine Datei mit dem Namen erstellt
-
:echo hello > -
Wie kann ich
-
in diesem Beispiel STDOUT bedeuten?Umgekehrt, wie kann ich
-
eine Datei mit folgenden Namen bedeuten-
:cat -
2>&-
Konstruktionen, die "Nahdeskriptor 2" bedeuten.Antworten:
Unter Verwendung
-
als Dateinamen stdin / stdout zu verstehen ist eine Konvention , die viele Programme verwenden. Es ist keine spezielle Eigenschaft des Dateinamens. Der Kernel erkennt dies nicht-
als besonders. Daher werden Systemaufrufe, die auf-
einen Dateinamen verweisen,-
buchstäblich als Dateinamen verwendet.-
Wird bei der Bash-Umleitung nicht als besonderer Dateiname erkannt, verwendet Bash diesen als wörtlichen Dateinamen.Wenn
cat
die Zeichenfolge-
als Dateiname angezeigt wird, wird sie als Synonym für stdin behandelt. Um dies zu umgehen, müssen Sie den angezeigten String so änderncat
, dass er immer noch auf eine aufgerufene Datei verweist-
. Die übliche Vorgehensweise besteht darin, dem Dateinamen den Pfad -./-
, oder - voranzustellen/home/Tim/-
. Diese Technik wird auch verwendet, um ähnliche Probleme zu umgehen, bei denen Befehlszeilenoptionen mit Dateinamen kollidieren, sodass beispielsweise eine Datei, auf die Bezug genommen wird,./-e
nicht als-e
Befehlszeilenoption für ein Programm angezeigt wird.quelle
/dev/stdin
und/dev/stdout
sind universell verfügbar und kann anstelle der verwendet werden-
Konvention.cat
Fall kann die Verwendung der Umleitung anstelle der Auflistung des Arguments hilfreich seincat <-
:; Es wäre jedoch schwierig, dies zu mischen und abzugleichen, wenn mehrere Dateien gleichzeitig verkettet würden.jmtd
die Frage wissen ? :)Stattdessen
echo hello > -
können Sie verwendenecho hello > /dev/stdout
.Während '-' eine Konvention ist, die von jedem Programm implementiert werden muss, das sie unterstützen möchte
/dev/stdin
,/dev/stdout
und/dev/stderr
wenn sie vom Betriebssystem unterstützt wird (zumindest von Solaris, Linux und BSDs), unabhängig von der Anwendung ist und dann wie Sie funktioniert wollen.quelle
Wie bereits erwähnt ,
-
ist dies nur eine Namenskonvention, die von einigen Programmen verwendet wird. Wenn Sie auf diese Streams mit einem Dateideskriptor verweisen möchten, den die Shell erkennt, war es richtig, dass Sie den Namen/dev/stdin
oder/dev/stdout
stattdessen verwendet haben. Diese Dateinamen sollten an jedem Ort funktionieren, an dem ein normaler Dateiname funktionieren würde.Davon abgesehen ist Ihr erstes Beispiel irgendwie albern. Alle Ausgaben, die vom Redirect-Operator zum Schreiben in eine Datei abgefangen werden, sind bereits auf ON-Standardausgabe gesetzt. Das Umleiten und Zurückschreiben an den Speicherort ist daher sinnlos. Das Verhalten, das Sie dort verwenden, ist die Pipe, keine Umleitung:
In Ihrem zweiten Beispiel müssen Sie lediglich angeben, dass Sie eine Wurfdatei mit diesem Namen und nicht mit dem internen Aliasnamen möchten. Sie können dies am einfachsten tun, indem Sie einen Pfad zu der Datei wie folgt angeben:
quelle
Wie bei 1 muss das Programm dies unterstützen. Sie können es nicht einfach beliebig verwenden. Wie für 2, leiten Sie die Eingabe von (z
cat < -
. B. ) um.quelle
Der '-' Ansatz hat viele Probleme. Erstens erfordert es eine Interpretation des '-' Zeichens und viele Programme führen eine solche Interpretation nicht durch. Darüber hinaus gibt es einige Programme, die einen Bindestrich als Trennzeichen für das Ende der Befehlszeilenoptionen interpretieren. Die Programme sind so geschrieben, dass sie mit Dateinamenargumenten arbeiten. Der '-' Ansatz ist ein Hack, nett, aber schwach.
Der beste Weg ist:
/dev/stdout
ist ein symbolischer Link von/dev/fd/1
quelle