número flexível de agruments com xargs

0

É possível especificar o número de argumentos que xargsleva sem fazê-lo explicitamente com a -nopção, mas implicitamente com um delimitador, para que os parâmetros únicos sejam delimitados com um espaço, mas um grupo de argumentos que xargs usa ao mesmo tempo seria delimitado com por exemplo '\n'?

Quero poder passar um número flexível de parâmetros para um script: Esses parâmetros são armazenados em uma lista como esta:

param1 param2
param1 param2 param3
param1

Deve ser possível passar uma linha de parâmetros por vez para o script. Não quero usar nenhum script proxy e não desejo gravar uma lista temporária de arquivos ou comando no disco. Quero ler os parâmetros do arquivo, alterá-los "on the fly" (por exemplo, remover todas as outras linhas) e redirecioná-los com xargs para o script de destino.

O que tentei é usar '\n'como delimitador de argumento, mas todos os parâmetros de uma linha são interpretados como um argumento, mesmo que sejam delimitados com um espaço.

enfeitar
fonte
Codificar as invocações do programa ou chamar um script que espera 6 argumentos e os divide nessas três chamadas não é uma opção?
Daniel Beck
Não, este é apenas um exemplo, a lista pode ter qualquer tamanho. Também não quero fazer isso com um script proxy que divida os argumentos delimitados por espaço.
crenate

Respostas:

0

Q

O que eu quero alcançar é passar a seguinte lista pelo xargs, mas uma linha de cada vez:

UMA

$ 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

Porém, existem maneiras mais fáceis de obter essa saída sem usar xargs; portanto, você pode esclarecer sua pergunta.


Atualizar

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

Não acho que xargs seja a resposta para sua tarefa. Eu suspeito que você estaria melhor usando algum script no lugar de xargs.

RedGrittyBrick
fonte
Obrigado, mas não quero escrever arquivos intermediários. Eu editei a pergunta para esclarecer. Eu gostaria de fazer isso "on the fly".
crenate
@mithy: resposta atualizada em conformidade.
precisa saber é o seguinte
Sim, você está certo, o loop faz o que eu quero. Obrigado!
crenate
1

Com o GNU Parallel, você pode:

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

Se é aceitável que os parâmetros sejam unidos como um, você pode até fazer:

cat yourfile | parallel echo {}

Você pode instalar o GNU Parallel simplesmente:

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

Assista aos vídeos de introdução do GNU Parallel para saber mais: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Ole Tange
fonte