Jak powtórzyć zmienne dwukrotnie w xargs


21

Jak mogę wykonać drugi test echa w tym przykładzie:

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

var=test & echo $var ...
Alexus

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 {}

3
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ą {}):

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

1
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.

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


2
Dodałem trochę formatowania do twojej odpowiedzi, aby była bardziej czytelna. Mam nadzieję, że dobrze to zrozumiałem.
fra-san
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.