it-swarm.com.de

Verwendung des Bindestrichs (-) anstelle eines Dateinamens

Wenn für einen Befehl - Als Argument anstelle eines Dateinamens verwendet wird, bedeutet dies STDIN oder STDOUT.

  1. In diesem Beispiel wird jedoch eine Datei mit dem Namen - Erstellt:

    echo hello > -
    

    Wie kann ich - In diesem Beispiel STDOUT bedeuten lassen?

  2. Umgekehrt, wie kann ich - Eine Datei mit dem Namen - In Beispielen wie:

    cat -
    
121
Tim

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, daher verwenden alle Systemaufrufe, die auf - Als Dateinamen verweisen, - Wörtlich als Dateinamen.

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 für ein Programm beispielsweise nicht als -e - Befehlszeilenoption angezeigt wird .

169
camh
  1. Anstelle von echo hello > - Können Sie echo hello > /dev/stdout Verwenden.

    Während '-' eine Konvention ist, die von jedem Programm implementiert werden muss, das sie unterstützen möchte, sind /dev/stdin, /dev/stdout Und /dev/stderr (Zumindest vom Betriebssystem unterstützt) Solaris, Linux und BSDs tun dies unabhängig von der Anwendung und funktionieren dann wie beabsichtigt.

18
jlliagre

Wie 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 Folgendes: jiliagre war korrekt , wenn Sie stattdessen den Namen /dev/stdin Oder /dev/stdout Verwenden. Diese Dateinamen sollten überall dort funktionieren, wo ein normaler Dateiname funktionieren würde.

  1. Davon abgesehen 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 |
    
  2. In Ihrem zweiten Beispiel müssen Sie lediglich einen Hinweis geben, dass Sie eine Wurfdatei mit diesem Namen möchten, nicht den internen Alias, den sie hat. Sie können dies am einfachsten tun, indem Sie einen Pfad zur Datei wie folgt angeben:

    cat ./-
    
10
Caleb

1 muss vom Programm unterstützt werden. Sie können es nicht einfach willkürlich verwenden. Wie für 2, leiten Sie die Eingabe von (z. B. cat < -).

6
bahamat

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 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

1
b3h3m0th

Sonderzeichen haben meist zwei Bedeutungen:

ASCII numerisches Diagramm.

Scripting oder symbolisch.

Es ist möglich, dass ein einzelnes Zeichen eine Zeichenfolge darstellt oder als Zeichenfolge fungiert. als mein Verständnis.

in der Sprache C verwendet die Funktion fopen() zwei Argumente: den ersten Dateistream und den zweiten Modus, in dem die Datei geöffnet wird. Der Modus ist eine Zeichenfolge. auch wenn es ein einzelnes Zeichen ist.

cat> "-" funktioniert.

0
Owais Qureshi