Wie kann ich Zeichen an einen Befehl senden, als stammten sie aus einer Datei?
Zum Beispiel habe ich versucht:
wc < "apple pear orange"
-bash: apple pear orange: No such file or directory
In Schalen , die Unterstützung hier Strings , einschließlich bash
, zsh
und ksh93
können Sie verwenden
wc <<< "apple pear orange"
Zwei weitere Ansätze (die eine mehrzeilige Eingabe ohne zusätzlichen Aufwand ermöglichen):
Verwenden Sie ein "hier Dokument":
Die
EOF
Zeichenfolge ist ein Begrenzer. Sie können eine beliebige Zeichenfolge verwenden.EOF
ist nur eine konventionelle Wahl.Verwenden Sie das tty als Eingabe:
Dies hat den Nachteil, dass das Programm zu starten beginnt und die Eingabe liest, sobald Sie den Namen eingeben. Dies kann beunruhigend sein. beispielsweise:
quelle
<<<
Formular ermöglicht auch die Eingabe mehrerer Zeilen ohne zusätzlichen Aufwand, da die"
eingeschlossene Zeichenfolge Zeilenumbrüche enthalten kann. Natürlich ist das<< EOF
Formular (die ursprüngliche Here-Doc-Syntax) leichter zu lesen, wenn Sie mehrzeilige Eingaben haben.<<<
word
- natürlich kann im Kontext der Shellword
ein String in Anführungszeichen stehen, der Leerzeichen und Zeilenumbrüche enthält! D'oh! Das ist so offensichtlich, dass es selbstverständlich ist (und tatsächlich sehe ich es überhaupt nicht in der Manpage erwähnt). :-( Danke, dass du mich darauf hingewiesen hast!word
ist in der Manpage als "Eine Zeichenfolge, die von der Shell als eine Einheit betrachtet wird" (auch "Token" genannt) definiert. Sie müssen wissen, dass Zeichenfolgen in Anführungszeichen im relevanten Sinne (nach "eine Einheit") als "eine Einheit" behandelt werden Backslash-Verarbeitung, variable Erweiterung usw. "Aber genau das ist der Zweck der doppelten Anführungszeichen in der Shell. (Einfache Anführungszeichen schützen auch vor Erweiterung.) Das Verarbeitungsmodell der Shell ist sehr gut durchdacht und alles andere als einfach.Obwohl es hier mehrere gültige Lösungen gibt, ist es eine andere Syntax, die manchmal nützlich sein kann, einen Befehl auszuführen
<()
. Auf diese Weise können Sie mehr als ein Dateideskriptorobjekt in einer Befehlszeile erstellen.Dies kann nützlich sein, wenn Sie beispielsweise lange Textfolgen vergleichen oder Inhalte, die sich nicht in einer Datei befinden, vergleichen möchten.
Vergleichen Sie beispielsweise die Hosts-Dateien auf zwei Knoten, ohne die Hosts-Datei auf den localhost kopieren zu müssen:
Das
<
leitet eine Datei zu STDIN um und das()
erstellt eine Subshell, um den Befehl zwischen den Klammern auszuführen. Es ist das STDOUT aus der Subshell, das an STDIN des ausgeführten Befehls übergeben wird.Es ist eine einfachere Möglichkeit, mehr als eine Eingabe- "Datei" für einen Befehl zu erstellen, als zu versuchen, mehrere Dokumente hier zu verwenden oder mehrere Befehle an eine Pipeline zum endgültigen Befehl zurückzugeben.
quelle
<fileorpathname
leitet stdin um,<(subcmd)
tut es aber nicht; Es ersetzt einen Namen, der beim Öffnen durch das Programm stdout von subcmd lesen kann.< <(subcmd)
(Platz benötigt) leitet stdin von dieser Datei fast wie umsubcmd |
. Siediff
können eine der Eingaben von stdin lesen, indem Sie ein Argument von-
aber nicht von beiden angeben .cmd <(cmd2 ...)
und hinzufügencmd < <(cmd2 ...)
. Ersteres ermöglicht es, abgeleitete Daten (die Ausgabe von cmd2) anstelle eines Dateinamens zu verwenden. Letzteres ist äquivalent zucmd2 ... | cmd
. Befehle müssen geschrieben werden, um stdin-Eingaben explizit zu akzeptieren, viele jedoch nicht. Dies gilt insbesondere für Shell-Skripte.Sie können eine Pfeife verwenden
quelle
Möglicherweise möchten Sie etwas Ähnliches verwenden. Im Folgenden finden Sie ein einfaches Beispiel für das Öffnen einer Remote-Telnet-Sitzung, das Warten auf die Eingabeaufforderung, das Senden einiger Daten, das Warten auf eine Antwort, den Ruhezustand und das Beenden.
quelle