гнучка кількість agruments з xargs


0

Чи можна вказати кількість аргументів, які xargsприймає, не роблячи це явно з -nопцією, але неявно з роздільником, щоб окремі параметри були розмежовані пробілом, але групу аргументів, які приймає xargs одразу, буде розмежовано наприклад '\n'?

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

param1 param2
param1 param2 param3
param1

Сценарій повинен одночасно передавати один рядок параметрів. Я не хочу використовувати будь-які проксі-скрипти і не хочу писати тимчасовий список файлів або команд на диск. Я хочу прочитати параметри з файлу, змінити їх "на льоту" (наприклад, видалити всі інші рядки) та перенаправити їх з xargs до цільового сценарію.

Я намагався використовувати '\n'як роздільник аргументів, але, ніж усі параметри в рядку, інтерпретуються як один аргумент, навіть якщо вони розмежовані пробілом.


Жорстке кодування викликів програми або виклик сценарію, який очікує 6 аргументів і розбиває їх на ці три виклики, не є варіантом?
Даніель Бек

Ні, це лише приклад, список може бути будь-якої довжини. Також я не хочу робити це за допомогою проксі-скрипту, який розбиває аргументи з обмеженим простором.
кренат

Відповіді:


0

Q

Хочеться, щоб я хотів досягти, це передати наступний список через xargs, але по одному рядку:

А

$ cat t7.txt
param1 param2
param1 param2 param3
param1

$ cat t7.sh
#!/bin/bash
cat t7.txt | while read line
do
  echo $line | xargs echo XXX
done

$ ./t7.sh
XXX param1 param2
XXX param1 param2 param3
XXX param1

Але є більш прості способи досягти цього результату без використання xargs, тому ви можете уточнити своє питання.


Оновлення

$ while read line; do echo "< $line >"; done
p1 p2
< p1 p2 >
p1
< p1 >
p1 p2 p3
< p1 p2 p3 >

Я не думаю, що xargs - це відповідь на ваше завдання. Я підозрюю, що вам краще використовувати сценарій замість xargs.


Дякую, але я не хочу писати проміжні файли. Я відредагував питання, щоб уточнити. Я хотів би зробити це "на льоту".
кренат

@mithy: Відповідь оновлено відповідно.
RedGrittyBrick

Так, ви праві, петля робить те, що я хочу. Дякую!
кренат

1

З GNU Parallel ви можете:

cat yourfile | parallel -q bash -c 'echo {}'

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

cat yourfile | parallel echo {}

Ви можете встановити GNU Parallel просто:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem

Перегляньте вступні відео для паралельних GNU, щоб дізнатися більше: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

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