Как дважды повторить переменные в 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
Обратите внимание , что вы получите неожиданные результаты в последнем коде , если вы AFile callod, буквально $(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.