Im Zusammenhang mit einer Frage zu Stack Overflow: Mehrere Codezeilen an wsadmin.sh übergeben? .
Ich habe als Zeichenfolge ein paar Eingabezeilen, die ich in einen Befehl eingeben muss. Der Befehl akzeptiert jedoch nur eine Datei voller Eingaben.
Gibt es eine Möglichkeit, die Zeilen in einer temporären Datei oder Pipe zu speichern, die eigentlich nie auf die Festplatte geschrieben wird, und diese dann direkt in das Programm einzuspeisen?
Wie kann ich die Pipe erfassen, die Eingabe in sie einspeisen, die Pipe an den Befehl übergeben und dann die Pipe entfernen?
linux
command-line
bash
ArtOfWarfare
quelle
quelle
Antworten:
Eine andere Lösung ist die Verwendung von Process Substitution in Bash. Wenn Ihr System Named Pipes hat, können Sie diese Funktion verwenden.
Es wird wie folgt verwendet:
wo
list
ist eine Folge von Shell-Befehlen (eigentlich Pipelines; die vollständigen Details sind hier ).list
wird ausgeführt und sein Ausgang wird mit der Pipe verbunden. Der Name der Pipe wird dann an Ihr Programm übergeben.HINWEIS: Leerzeichen zwischen
<
und sind nicht zulässig(
.(Die andere Ersetzung
>(list)
funktioniert ebenfalls wie erwartet.)In Ihrem speziellen Fall könnten Sie verwenden
obwohl Sie vielleicht finden, dass @ meuhs Lösung eleganter ist.
Update: Eine Vielzahl von Anwendungsbeispielen finden Sie im Advanced Bash Scripting Guide .
quelle
Sie können ein bash here-doc verwenden . Beispielsweise,
Wenn Sie etwas in einer Bash-Variablen haben, können Sie es auch interpolieren: z
<<<"path is $PATH"
.Wenn Ihr Befehl auf einem Dateinamen besteht, können Sie diesen angeben
/dev/stdin
. Z.B:erzeugt die Ausgabe:
s/b/b/
.quelle
stdin
, und wenn nicht, wird dies nicht funktionieren. Ich hoffe das OP klärt."-f" option must be followed by a file name.
-f
einen Dateinamen benötigt, geben Sie diesen an/dev/stdin
. Siehe meine Bearbeitung./dev/stdin
Vorschlag. Das Programm, das ich aufzurufen versuche, akzeptiert nur einen Dateinamen, also habe ich es/dev/stdin
mit einem Heredoc kombiniert .Je nachdem, was im Skript enthalten ist, können Sie möglicherweise den speziellen Dateinamen (Minus) verwenden, der für stdin steht
Eine andere Methode, die für Sie funktionieren kann, ist das Öffnen der Datei,
/dev/fd/0
die wieder für stdin steht .Eine dritte Möglichkeit kann darin bestehen, ein FIFO (First In First Out) zu erstellen . Das ist wie eine Datei, hat aber zwei Enden: Sie schreiben an ein Ende und lesen vom anderen.
quelle
-
werden muss - es ist keine Funktion der Shell oder des Betriebssystems. Natürlich folgen die meisten Standard-Linux-Dienstprogramme dieser Konvention, soweit ich weiß.expect
.<()
Lösung, sind jedoch ausführlicher - was sehr nützlich sein kann!Es gibt eine andere Option, die der
mycmd -
Lösung ähnelt , aber auch für Programme, die nicht-
speziell behandelt werden:/dev/stdin
scheint mit dem Betriebssystem zu tun zu haben und funktioniert unter Debian GNU / Linux, aber ich bin mir nicht sicher, wo es sonst auch funktionieren wird.quelle
^D
?^D
ist eine gebräuchliche Notation für das Drücken von Strg-D. ^ D hat hier die Semantik "Ende des Eingabestroms". Es ist wahrscheinlich öfter zu sehen in^C
oder^Z
welche für das Drücken von Strg-C bzw. Strg-Z stehen./dev/stdin
und dann schließen?cat content | mycmd /dev/stdin
. Stellen Sie sich andere Befehle alscat
hier vor.