So wiederholen Sie Variablen in xargs zweimal


21

Wie kann ich auch in diesem Beispiel das zweite Echo für den Echo-Out-Test erzeugen:

 echo test  | xargs -I {} echo {} && echo {}
xargs 

var=test & echo $var ...
Alexus

xargs -I {} var = {} echo $ var && echo $ var Das würde Ihnen geben: Keine solche Datei oder Verzeichnis.

Antworten:


27

Schreiben Sie einfach {}zwei Mal in Ihren Befehl. Folgendes würde funktionieren:

$ echo test | xargs -I {} echo {} {}
test test

Ihr Problem ist, wie die Befehle verschachtelt sind . Schauen wir uns das an:

echo test | xargs -I {} echo {} && echo {}

Bash wird ausgeführt echo test | xargs -I {} echo {}. Wenn es erfolgreich läuft, echo {}wird ausgeführt. Um die Verschachtelung zu ändern, können Sie Folgendes tun:

echo test | xargs -I {} sh -c "echo {} && echo {}"

Es kann jedoch zu Problemen kommen, da der Ansatz möglicherweise zu Code-Injection neigt. Wenn "test" durch Shell-Code ersetzt wird, wird dieser ausgeführt. Daher sollten Sie die Eingabe wahrscheinlich mit Argumenten an die verschachtelte Shell übergeben.

echo test | xargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}

3
Beachten Sie, dass Sie in Ihrem letzten Code unerwartete Ergebnisse erhalten, wenn Sie buchstäblich einen Kallod haben $(rm -f *). Es ist besser zu tunxargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}
Kusalananda

@ Kusalananda, danke. Ich war mir des Problems bewusst, konnte mir aber zu diesem Zeitpunkt keine einfache Lösung vorstellen. Ich habe Ihren Vorschlag in die Antwort integriert.
JojOatXGME

5

Eine andere Option ist die Verwendung des -iFlags, das dasselbe ist wie -I{}(dies impliziert, dass die Ersetzung durch gegeben ist {}):

$ echo test | xargs -i echo {} {}

1
In der Zwischenzeit: This option is deprecated; use -I instead.wurde dem Handbuch hinzugefügt man xargs.
Jonathan Komar

0

Bei mir funktioniert nur der Kleinbuchstabe. Ich hatte Hunderte von Bildern in einem Verzeichnis und wollte diese Quellen in eine Liste aufnehmen. Die -IOption i für Großbuchstaben hat bei mir nicht funktioniert. Nur die Kleinschreibung. Wahrscheinlich aufgrund von Versionsunterschieden. Diese Bilder hatten alle Namen wie Daniel_(somenumber).jpg.

Diese Syntax hat funktioniert:

ls -l | tr -s ' ' ':'| cut -d: -f9 | xargs -i echo "img src='"{}"'alt='{}'"

Kehrt zurück:

src='Daniel_248.jpg' alt='Daniel_248.jpg'
...

Linux Version 4.14.96-hw + # 80 SMP x86_64 GNU / Linux


2
Ich habe Ihrer Antwort einige Formatierungen hinzugefügt, um sie besser lesbar zu machen. Ich hoffe ich habe es richtig verstanden.
Freitag,
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.