Wie kann man sagen, welcher Parameter einem Befehl mit einem Weiterleitungsoperator übergeben wird?

8

Das funktioniert:

  

$ echo "notify-send HELLO" | bei jetzt

Das tut nicht:

  

$ bei jetzt & lt; echo "benachrichtigen-senden HELLO"

Es heißt "Datei oder Verzeichnis nicht gefunden".

Ich verstehe, dass es eine Option -f für diesen Befehl gibt, mit der ich die Datei bereitstellen kann, die zu einem bestimmten Zeitpunkt ausgeführt werden soll.

Das hat mich zum Nachdenken gebracht ... im Allgemeinen, woher weiß ich, für welchen Parameter die Umleitungsoperatoren den Wert liefern?

    
vlad-ardelean 14.04.2014, 20:51

2 Antworten

15

Sie verwenden hier zwei verschiedene Dinge und sollten eine dritte verwenden. Mal sehen:

  1. | : Dies ist der Operator pipe , der dazu dient, die Ausgabe eines Prozesses als Eingabe an eine andere zu übergeben:

    foo | bar
    

    Dies führt das Programm foo aus und übergibt seine Ausgabe als Eingabe an das Programm bar .

  2. > , < , >> und << : Dies sind die Weiterleitungsoperatoren , dienen sie zum Senden von Daten an / von Dateien :

    • foo > bar : Führt das Programm foo aus und speichert seine Ausgabe in der Datei bar , überschreiben 1 seinen Inhalt und erstelle es, wenn es nicht existiert.

    • foo >> bar : Führt das Programm foo aus und speichert seine Ausgabe in der Datei bar , hängt an seinen Inhalt an und erstellt es, wenn es vorhanden ist existiert nicht.

    • foo < bar : Führt foo aus und teilt ihr mit, dass sie Eingaben von der Datei bar lesen soll.

    • Der << ist ein Sonderfall, da es keinen Sinn macht, die Eingabe an einen Befehl "anzufügen", der << wird hauptsächlich (ausschließlich AFAIK) für Hier Dokumente :

      $ cat << EOF > file.txt
      > Hello World!
      > EOF
      

      Das Konstrukt << SomeStringHere > Out.file leitet den gesamten geschriebenen Text um, bis die Endzeichenfolge ( EOF im obigen Beispiel) auf die Zieldatei trifft. Mit dieser Dokumentation können Sie mehrzeilige Strings problemlos formatieren und Variablen und Sonderzeichen einfügen.

  3. Der <<< Operator, die Here String , ist wie eine Hier Dokument aber es erweitert Variablen. Also zum Beispiel:

    grep foo <<< "$bar"
    

    Der obige Befehl entspricht echo "$bar" | grep foo .

  4. Was Sie eigentlich suchen, heißt Prozesssubstitution und ist eine andere Möglichkeit Übergeben Sie die Ausgabe eines Befehls an einen anderen. Es besteht aus <(command) .

    foo <(bar) 
    

    Also könnten Sie für Ihr at Beispiel

    machen
    at now < <(echo "notify-send HELLO")
    

    Das obige funktioniert, weil die Prozesssubstitution tatsächlich eine Datei erstellt (lesen Sie den obigen Link für weitere Details) und es ist der Dateideskriptor dieser Datei, der mit < an at now übergeben wird.

1 Das Standardverhalten ist das Überschreiben, das kann geändert werden, indem Sie die Option noclobber auf bash setzen. Falls gesetzt, wird echo foo > bar fehlschlagen, wenn bar existiert. In diesem Fall kann stattdessen die Verwendung von echo foo |> bar erzwungen werden. Siehe Abschnitt 3.6.2 hier .

    
terdon 14.04.2014, 21:08
12

In diesem Fall ist echo "notify-send HELLO" ein Prozess keine Datei - Sie benötigen also ein Prozesssubstitution statt einer Dateiumleitung

at now < <(echo "notify-send HELLO")

Sie hätten auch eine Zeichenfolge hier verwenden können, um den Befehl echo vollständig zu vermeiden / p>

at now <<< "notify-send HELLO"
    
steeldriver 14.04.2014 21:05

Tags und Links