Für einen Befehl, wenn -
als Argument verwendet wird Anstelle eines Dateinamens 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 lassen? -
Umgekehrt kann
-
eine Datei mit dem Namen-
in Beispielen wie:cat -
Kommentare
- Da ich anscheinend 50 Ruf haben muss, um direkt zu kommentieren .. Im Kommentar / dev / stdin / dev / stdout verfügt AIX, ein legitimes UNIX-Derivat, nicht über diese Pseudogeräte. Und als weiterer Kommentar ist LINUX auf keinen Fall ein UNIX-Derivat. Es ist ein POSIX-kompatibles Workalike und das beliebteste UNIX-ähnliche Betriebssystem ‚, aber machen Sie keinen Fehler, dies ist kein UNIX. Der Kern der Antworten hier ist jedoch richtig. Die Notation “ – “ wird von der Shell nicht als speziell interpretiert und daher direkt als ARG an jede einzelne Anwendung übergeben. Wenn die Anwendung
- nicht erkennt, gibt es auch eine
2>&-
-Konstruktion, was bedeutet, dass “ Deskriptor 2 „. - @ user95873, ich nehme an, Sie wollten sagen: Während Linux Unix-ähnlich ist, ist nicht jedes Unix-ähnlich (oder echtes UNIX) Linux . Die Frage, ob Linux ‚ nicht wahres UNIX ist oder nicht (dh entspricht der Single UNIX-Spezifikation), hat ‚ keine Beziehung zu / dev / std {in, out, err} Problem. Als / dev / std {in, out, err} wird die Funktion hinzugefügt hinzugefügt und fehlt nicht .
Antwort
Die Verwendung von -
als Dateiname für stdin / stdout ist eine Konvention, die viele Programme verwenden. Es ist keine besondere Eigenschaft des Dateinamens. Der Kernel erkennt -
nicht als speziell, sodass alle Systemaufrufe, die auf -
als Dateinamen verweisen, -
wörtlich als Dateiname.
Bei der Bash-Umleitung wird -
nicht als spezieller Dateiname erkannt, daher verwendet bash diesen als wörtlichen Dateinamen.
Wenn cat
die Zeichenfolge -
als Dateinamen sieht, wird sie als Synonym für stdin behandelt. Um dies zu umgehen, müssen Sie die Zeichenfolge, die cat
sieht, so ändern, dass sie immer noch auf eine Datei mit dem Namen -
verweist. Die übliche Vorgehensweise besteht darin, dem Dateinamen einen Pfad voranzustellen – ./-
oder /home/Tim/-
. Diese Technik wird auch verwendet, um ähnliche Probleme zu umgehen, bei denen Befehlszeilenoptionen mit Dateinamen kollidieren, sodass eine als ./-e
bezeichnete Datei nicht als -e
Befehlszeilenoption für ein Programm, zum Beispiel.
Kommentare
- Es ‚ s Erwähnenswert ist, dass
/dev/stdin
und/dev/stdout
universell verfügbar sind und anstelle von-
Konvention. - @jmtd: / dev / std {in, out} sind nicht allgemein verfügbar. Nicht alle Unixe haben es.
- Interessant, ich nahm an, dass sie Teil von POSIX waren (kann aber ‚ nicht bestätigen). Sie ‚ sind zumindest unter Linux, BSDs und Solaris vorhanden. Können Sie ein Beispiel für ein modernes UNIX geben, dem diese fehlen?
- @camh Sie sind sich nicht sicher, ob Sie die Benachrichtigung erhalten haben, und dies ist ein sehr, sehr altes Thema. Ich ‚ bin mir nicht sicher, ob Sie können, aber ich ‚ bin sehr neugierig, ob Sie die Antwort auf ‚ s Frage? 🙂
- @jmtd Ich habe anscheinend eine vorläufige Antwort auf die Frage gefunden: unix.stackexchange.com/a/278368/31669
Antwort
-
Anstelle von
echo hello > -
können Sieecho hello > /dev/stdout
verwenden.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
werden vom Betriebssystem unterstützt (zumindest Solaris, Linux und BSDs). , unabhängig von der Anwendung und funktioniert dann wie beabsichtigt.
Antwort
As camh erwähnt , -
ist nur eine Namenskonvention, die von einigen Programmen verwendet wird.Wenn Sie mit einem Dateideskriptor auf diese Streams verweisen möchten, erkennt die Shell, dass jiliagre den Namen /dev/stdin
oder /dev/stdout
stattdessen. Diese Dateinamen sollten an jeder Stelle funktionieren, an der ein normaler Dateiname funktionieren würde.
-
Abgesehen davon ist Ihr erstes Beispiel irgendwie albern. Jede Ausgabe, die vom Umleitungsoperator zum Schreiben in eine Datei abgefangen wird, ist bereits auf Standardausgabe eingestellt. Daher ist es nutzlos, sie umzuleiten und dorthin zurückzuschreiben, woher sie stammt. Das Verhalten, das Sie dort verwenden, ist die Pipe, keine Umleitung:
echo hello |
-
In Ihrem zweiten Beispiel müssen Sie einfach einige geben Hinweis, dass Sie eine Wurfdatei mit diesem Namen möchten, nicht den internen Alias. Sie können dies am einfachsten tun, indem Sie einen Pfad zur Datei wie folgt angeben:
cat ./-
Antwort
1 muss vom Programm unterstützt werden. Sie können es nicht einfach willkürlich verwenden. Wie bei 2, leiten Sie die Eingabe von (z. B. cat < -
) um.
Antwort
Der „-“ – Ansatz weist viele Probleme auf. Erstens erfordert er 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 interpretieren, das das Ende der Befehlszeilenoptionen kennzeichnet. Die Programme sind so geschrieben, dass sie mit Dateinamenargumenten arbeiten. Der Ansatz „-“ ist ein Hack, nett, aber schwach.
Der beste Weg ist:
$ echo hello > /dev/fd/1
/dev/stdout
ist eine symbolische Verknüpfung von /dev/fd/1
Kommentare
- Die Umleitung wird von der Shell interpretiert, nicht vom aufgerufenen Programm.
Antwort
Sonderzeichen haben meist zwei Bedeutungen:
ASCII-Zahlendiagramm.
Skripterstellung oder Symbolik.
Es ist möglich, dass ein einzelnes Zeichen eine Zeichenfolge darstellt oder nach meinem Verständnis als Zeichenfolge fungiert.
in C-Sprache fopen()
verwendet zwei Argumente: den ersten Dateistream und den zweiten Modus, in dem die Datei geöffnet wird. Der Modus ist eine Zeichenfolge. Auch wenn es sich um ein einzelnes Zeichen handelt.
cat > “ – “ funktioniert.