it-swarm.com.de

Übergeben Sie Text an das Programm, das eine Datei erwartet

Im Zusammenhang mit einer Frage, die ich bei Stack Overflow gestellt habe: Übergeben mehrerer Codezeilen an wsadmin.sh? .

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?

29
ArtOfWarfare

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:

program_expecting_a_file <(list)

dabei ist list eine Folge von Shell-Befehlen (eigentlich Pipelines; die vollständigen Details finden Sie 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

program_expecting_a_file <(echo "$your_strings")

obwohl Sie vielleicht finden, dass @ meuhs Lösung eleganter ist.

Update: Eine Vielzahl von Anwendungsbeispielen finden Sie im Advanced Bash Scripting Guide .

25
Edward

Sie können eine Bash hier-docverwenden. Zum Beispiel,

$ cat -n <<<'a
> b'
 1  a
 2  b

Wenn Sie etwas in einer Bash-Variablen haben, können Sie es auch interpolieren: zB <<<"path is $PATH".


Wenn Ihr Befehl auf einem Dateinamen besteht, können Sie ihm /dev/stdin geben. Z.B:

$ sed -f /dev/stdin <<<'s/a/b/'

erzeugt die Ausgabe: s/b/b/.

13
meuh

Je nachdem, was im Skript enthalten ist, können Sie möglicherweise den speziellen Dateinamen verwenden - (minus), der für stdin steht.

$ mycmd -
Line 1
Line 2
^D

Eine andere Methode, die für Sie funktionieren kann, ist das Öffnen der Datei /dev/fd/0, die wiederum 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.

-- Process 1 --                  -- Process 2 --
$ mkfifo foo
$ cat foo
<waits>                          $ echo hello > foo
hello                            $
$ rm foo
7
Majenko

Es gibt eine andere Option, die der mycmd --Lösung ähnelt, aber auch für Programme, die nicht speziell mit - umgehen:

$ mycmd /dev/stdin
Line 1
Line 2
^D

/dev/stdin scheint mit dem Betriebssystem zu tun zu haben und funktioniert für mich unter Debian GNU/Linux, aber ich bin nicht sicher, wo es sonst auch funktionieren wird.

3
Axel Beckert