elastyczna liczba agrumentów z xargs


0

Czy możliwe jest określenie liczby argumentów, które należy podjąć xargsbez robienia tego jawnie za pomocą -nopcji, ale niejawnie za pomocą separatora, tak aby pojedyncze parametry były rozdzielane spacją, ale grupa argumentów pobieranych jednocześnie przez xargs byłaby ograniczona na przykład '\n'?

Chcę móc przekazać elastyczną liczbę parametrów do skryptu: parametry te są przechowywane na liście takiej jak ta:

param1 param2
param1 param2 param3
param1

Powinno być możliwe przekazywanie jednego wiersza parametrów jednocześnie do skryptu. Nie chcę używać żadnych skryptów proxy i nie chcę zapisywać tymczasowej listy plików ani poleceń na dysku. Chcę odczytać parametry z pliku, zmienić je „w locie” (np. Usunąć każdą inną linię) i przekierować je za pomocą xargs do skryptu docelowego.

Próbowałem użyć '\n'jako separatora argumentów, ale wszystkie parametry w linii są interpretowane jako jeden argument, nawet jeśli są one rozdzielone spacją.


Kodowanie wywołań programu lub wywoływanie skryptu, który oczekuje 6 argumentów i dzieli je na te trzy wywołania, nie jest opcją?
Daniel Beck

Nie, to tylko przykład, lista może mieć dowolną długość. Nie chcę też tego robić za pomocą skryptu proxy, który dzieli argumenty rozdzielane spacjami.
crenate

Odpowiedzi:


0

Q

Chcę, aby osiągnąć, to przekazać następującą listę przez xargs, ale jedną linię na raz:

ZA

$ 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

Są jednak łatwiejsze sposoby na osiągnięcie tego wyniku bez użycia xargs, więc możesz wyjaśnić swoje pytanie.


Aktualizacja

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

Nie sądzę, że xargs jest odpowiedzią na twoje zadanie. Podejrzewam, że lepiej byłoby użyć skryptu zamiast xargs.


Dzięki, ale nie chcę pisać plików pośrednich. Zredagowałem pytanie, aby wyjaśnić. Chciałbym to zrobić „w locie”.
crenate

@mithy: Odpowiedź odpowiednio zaktualizowana.
RedGrittyBrick

Tak, masz rację, pętla robi to, co chcę. Dziękuję Ci!
crenate

1

Dzięki GNU Parallel możesz:

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

Jeśli dopuszczalne jest, aby parametry były połączone jako jeden, możesz nawet zrobić:

cat yourfile | parallel echo {}

Możesz zainstalować GNU Parallel po prostu przez:

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

Obejrzyj wideo wprowadzające do GNU Parallel, aby dowiedzieć się więcej: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

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.