Das funktioniert:
$ echo "notify-send HALLO" | jetzt
Das geht nicht:
$ at now <echo "Benachrichtigen-Senden HALLO"
Es heißt "Datei oder Verzeichnis nicht gefunden".
Ich verstehe, dass es eine -f
Option für diesen Befehl gibt, mit der ich die Datei liefern kann, die zu einem bestimmten Zeitpunkt ausgeführt werden soll.
Das brachte mich zum Nachdenken ... Woher weiß ich im Allgemeinen, für welchen Parameter die Umleitungsoperatoren den Wert liefern?
command-line
bash
vlad-ardelean
quelle
quelle
foo | bar
undbar < foo
gleichwertig sind. Sie sind nicht.Antworten:
Sie verwenden hier zwei verschiedene Dinge und sollten ein drittes verwenden. Mal sehn:
|
: Dies ist der Pipe- Operator. Er dient dazu, die Ausgabe eines Prozesses als Eingabe an einen anderen zu übergeben:Dadurch wird das Programm ausgeführt
foo
und seine Ausgabe als Eingabe an das Programm übergebenbar
.>
,<
,>>
Und<<
: Dies sind die Umleitungsoperatoren dienen sie Daten zu / von senden Dateien :foo > bar
: führt das Programm ausfoo
und speichert seine Ausgabe in der Dateibar
, überschreibt 1 seinen Inhalt und erstellt ihn, wenn er nicht existiert.foo >> bar
: Führt das Programm ausfoo
und speichert sie auf dem seine Ausgangsdateibar
, anhängt , um den Inhalt und die Schaffung , wenn es nicht existiert.foo < bar
: wird ausgeführt undfoo
weist es an, Eingaben aus der Datei zu lesenbar
.Dies
<<
ist ein Sonderfall, da es keinen Sinn macht, Eingaben an einen Befehl<<
anzuhängen. Dies wird hauptsächlich (ausschließlich AFAIK) für Here Documents verwendet :Das Konstrukt
<< SomeStringHere > Out.file
leitet den gesamten geschriebenen Text um, bis es auf die Endzeichenfolge (EOF
im obigen Beispiel) trifft, in die Zieldatei. In den Dokumenten können Sie auf einfache Weise mehrzeilige Zeichenfolgen formatieren und Variablen und Sonderzeichen einfügen.Der
<<<
Operator, der Here-String , ähnelt einem Here-Dokument, erweitert jedoch Variablen. Also zum Beispiel:Der obige Befehl entspricht
echo "$bar" | grep foo
.Was Sie tatsächlich suchen, wird als Prozessersetzung bezeichnet und ist eine weitere Möglichkeit, die Ausgabe eines Befehls an einen anderen zu übergeben. Es besteht aus
<(command)
.Für Ihr
at
Beispiel könnten Sie es also tunDas Obige funktioniert, weil durch die Prozessersetzung tatsächlich eine Datei erstellt wird (lesen Sie den obigen Link für weitere Details) und es sich um den Dateideskriptor dieser Datei handelt, an
<
den übergeben wirdat now
.1 Das Standardverhalten ist das Überschreiben. Dies kann geändert werden, indem die
noclobber
Option auf Bash gesetzt wird. Wenn festgelegt,echo foo > bar
schlägt dies fehl, fallsbar
vorhanden. In diesem Fall kann stattdessen die Verwendung erzwungen werdenecho foo |> bar
. Siehe Abschnitt 3.6.2 hier .quelle
<<
und<<<
(die @steeldriver in seiner Antwort erwähnt hat) aufzunehmen. Darüber hinaus gibt es mehr - so etwas wie>>>>>>
oder<<<<<<<<<<
?<<<
:)In diesem Fall
echo "notify-send HELLO"
handelt es sich bei einem Prozess nicht um eine Datei. Sie benötigen daher eher eine Prozessersetzung als eine DateiumleitungSie hätten auch eine Here-Zeichenfolge verwenden können , um den
echo
Befehl vollständig zu vermeidenquelle