xargs -I {} var = {} echo $ var && echo $ var To dałoby: Brak takiego pliku lub katalogu.
Odpowiedzi:
27
Po prostu napisz {}dwa razy na swoje polecenie. Poniższe działałoby:
$ echo test | xargs -I {} echo {} {}
test test
Problem polega na zagnieżdżeniu poleceń . Spójrzmy na to:
echo test | xargs -I {} echo {} && echo {}
bash zostanie wykonany echo test | xargs -I {} echo {}. Jeśli działa poprawnie, echo {}jest wykonywany. Aby zmienić zagnieżdżanie, możesz zrobić coś takiego:
echo test | xargs -I {} sh -c "echo {} && echo {}"
Mogą się jednak pojawić problemy, ponieważ takie podejście może być podatne na wstrzykiwanie kodu. Gdy „test” zostanie zastąpiony kodem powłoki, zostanie wykonany. Dlatego prawdopodobnie powinieneś przekazać dane wejściowe do zagnieżdżonej powłoki z argumentami.
echo test | xargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}
Należy pamiętać, że dostaniesz nieoczekiwane rezultaty podczas ostatniego kodu jeśli aFile callod dosłownie $(rm -f *). Lepiej to zrobićxargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}
Kusalananda
@Kusalananda, dzięki. Byłem świadomy problemu, ale w tej chwili nie mogłem wymyślić prostego rozwiązania. Włączyłem twoją sugestię do odpowiedzi.
JojOatXGME
5
Inną opcją jest użycie -iflagi, która jest taka sama, jak -I{}(oznacza to, że zastąpienie następuje za pomocą {}):
W międzyczasie: This option is deprecated; use -I instead.dodano do instrukcji man xargs.
Jonathan Komar
0
Dla mnie działa tylko mała litera. Miałem setki zdjęć w katalogu i chciałem, aby źródła znalazły się na liście. -IOpcja wielkiej litery i nie działała dla mnie. Tylko małe litery. Prawdopodobnie z powodu różnic wersji. Wszystkie te zdjęcia miały nazwy Daniel_(somenumber).jpg.
var=test & echo $var ...
Odpowiedzi:
Po prostu napisz
{}
dwa razy na swoje polecenie. Poniższe działałoby:Problem polega na zagnieżdżeniu poleceń . Spójrzmy na to:
bash zostanie wykonany
echo test | xargs -I {} echo {}
. Jeśli działa poprawnie,echo {}
jest wykonywany. Aby zmienić zagnieżdżanie, możesz zrobić coś takiego:Mogą się jednak pojawić problemy, ponieważ takie podejście może być podatne na wstrzykiwanie kodu. Gdy „test” zostanie zastąpiony kodem powłoki, zostanie wykonany. Dlatego prawdopodobnie powinieneś przekazać dane wejściowe do zagnieżdżonej powłoki z argumentami.
źródło
$(rm -f *)
. Lepiej to zrobićxargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}
Inną opcją jest użycie
-i
flagi, która jest taka sama, jak-I{}
(oznacza to, że zastąpienie następuje za pomocą{}
):źródło
This option is deprecated; use -I instead.
dodano do instrukcjiman xargs
.Dla mnie działa tylko mała litera. Miałem setki zdjęć w katalogu i chciałem, aby źródła znalazły się na liście.
-I
Opcja wielkiej litery i nie działała dla mnie. Tylko małe litery. Prawdopodobnie z powodu różnic wersji. Wszystkie te zdjęcia miały nazwyDaniel_(somenumber).jpg
.Ta składnia działała:
Zwroty:
Linux w wersji 4.14.96-hw + # 80 SMP x86_64 GNU / Linux
źródło