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 {}
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 {}):
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.
var=test & echo $var ...
Antworten:
Schreiben Sie einfach
{}
zwei Mal in Ihren Befehl. Folgendes würde funktionieren:Ihr Problem ist, wie die Befehle verschachtelt sind . Schauen wir uns das an:
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: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.
quelle
$(rm -f *)
. Es ist besser zu tunxargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}
Eine andere Option ist die Verwendung des
-i
Flags, das dasselbe ist wie-I{}
(dies impliziert, dass die Ersetzung durch gegeben ist{}
):quelle
This option is deprecated; use -I instead.
wurde dem Handbuch hinzugefügtman xargs
.Bei mir funktioniert nur der Kleinbuchstabe. Ich hatte Hunderte von Bildern in einem Verzeichnis und wollte diese Quellen in eine Liste aufnehmen. Die
-I
Option i für Großbuchstaben hat bei mir nicht funktioniert. Nur die Kleinschreibung. Wahrscheinlich aufgrund von Versionsunterschieden. Diese Bilder hatten alle Namen wieDaniel_(somenumber).jpg
.Diese Syntax hat funktioniert:
Kehrt zurück:
Linux Version 4.14.96-hw + # 80 SMP x86_64 GNU / Linux
quelle