Як повторити змінні двічі в xargs


21

Як я можу зробити друге відлуння, щоб повторити тест також у цьому прикладі:

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

var=test & echo $var ...
alexus

xargs -I {} var = {} echo $ var && echo $ var Це дало б вам: Немає такого файлу чи каталогу.

Відповіді:


27

Просто напишіть {}два рази в свою команду. Працює таке:

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

Ваша проблема полягає в тому, як команди вкладені . Давайте подивимось на це:

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

Баш виконає echo test | xargs -I {} echo {}. Якщо вона працює успішно, echo {}виконується. Щоб змінити гніздування, ви можете зробити щось подібне:

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

Однак у вас можуть виникнути проблеми, оскільки підхід може бути схильний до введення коду. Коли "тест" замінюється кодом оболонки, він виконується. Тому, ймовірно, вам слід передати вхід до вкладеної оболонки з аргументами.

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

3
Зауважте, що ви отримаєте несподівані результати у своєму останньому коді, якщо у вас буде буквально посилання на файл $(rm -f *). Краще це зробитиxargs -I {} sh -c 'echo "$1" && echo "$1"' sh {}
Кусалаланда

@Kusalananda, дякую Я знав про проблему, але не міг придумати просте рішення в той момент. Я інтегрував вашу пропозицію у відповідь.
JojOatXGME

5

Іншим варіантом є використання -iпрапора, який є таким же, як -I{}(це означає, що заміна задається на {}):

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

1
Тим часом: This option is deprecated; use -I instead.додано до посібника man xargs.
Джонатан Комар

0

Для мене працює лише нижній регістр. Я мав сотні зображень у довіднику і хотів занести їх джерела в список. Версія верхнього регістру я -Iне працювала для мене. Лише нижній регістр. Можливо, через різниці версій. Усі ці зображення мали назви, якDaniel_(somenumber).jpg .

Цей синтаксис спрацював:

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

Повернення:

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

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


2
Я додав у вашу відповідь певне форматування, щоб зробити його більш читабельним. Сподіваюся, я правильно це зрозумів.
фра-сан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.