Übergeben der Befehlsausgabe als mehrere Argumente an einen anderen Befehl


12

Ich habe einen Befehl, der eine Ausgabe wie diese erzeugt:

$. / Befehl1
Wort1 Wort2 Wort3

Ich möchte diese drei Wörter als Argumente an einen anderen Befehl wie diesen übergeben:

$ command2 word1 word2 word3

Wie übergebe ich die Ausgabe von Befehl1 als drei verschiedene Argumente $ 1 $ 2 $ 3 an Befehl2?

Antworten:


8

Sie können verwenden xargs, wobei das -tFlag xargsausführlich ist und die ausgeführten Befehle druckt:

./command1 | xargs -t -n1 command2

-n1definiert die maximalen Argumente, die an jeden Aufruf von übergeben werden command2. Dies wird ausgeführt:

command2 word1
command2 word2
command2 word3

Wenn Sie alle als Argument eines Aufrufs command2verwenden möchten, gilt Folgendes :

./command1 | xargs -t command2

Das ruft command2 mit 3 Argumenten auf:

command2 word1 word2 word3

Was ist, wenn die Ausgabe von Befehl1 länger als ist ARG_MAX? Ich habe ein Szenario, in dem ich den Inhalt einer Datei an eine Funktion übergebe.
0xc0de

4

Sie möchten 'Befehlsersetzung', dh: Ausgabe eines Befehls in einen anderen einbetten

command2 $(command1)

Traditionell kann dies auch wie folgt erfolgen:

command2 `command1`

Diese Verwendung wird jedoch normalerweise nicht empfohlen, da Sie sie nicht verschachteln können.

Zum Beispiel:

test.sh:
#!/bin/bash
echo a b c

test2.sh

#!/bin/bash
echo $2

VERWENDEN:

./test2.sh $(./test.sh)
b

Wenn ich das mache, übergibt es die Ausgabe von command1 als ein einziges Argument, nicht wie drei verschiedene: $ command2 $ (cat output_from_command1)
Addy

Ah, richtig, eine Sekunde ... Übrigens wird eine Katze in der, die du dort hingelegt hast, nicht benötigt.
Sirex

Funktioniert bei mir. Wenn mein Befehl2 $ 2 (i, e: zweites Argument) wiedergibt, erhalte ich wie erwartet "word2".
Sirex

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.