Odpowiedzi:
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 {}
$(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ą {}
):
$ echo test | xargs -i echo {} {}
This option is deprecated; use -I instead.
dodano do instrukcji man 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 nazwy Daniel_(somenumber).jpg
.
Ta składnia działała:
ls -l | tr -s ' ' ':'| cut -d: -f9 | xargs -i echo "img src='"{}"'alt='{}'"
Zwroty:
src='Daniel_248.jpg' alt='Daniel_248.jpg'
...
Linux w wersji 4.14.96-hw + # 80 SMP x86_64 GNU / Linux
var=test & echo $var ...