xargs ignorando o segundo parâmetro de script

0

Eu estou chamando um script bash com dois parâmetros, vamos chamá-los de param_one e param_two . Eu também tenho um arquivo chamado test , que contém duas linhas:

line_one
line_two

Veja como meu script se parece:

cat test | xargs -I% bash -c 'echo % $1 $2;'

A saída que estou procurando é

line_one param_one param_two
line_two param_one param_two

mas eu continuo recebendo isso:

line_one
line_two

xargs está ignorando quando eu tenho mais de um parâmetro no script. Mesmo se eu mudar o script para isso, apenas imprime param_oneparam_one

cat test | xargs -I% bash -c 'printf '$1 $2';'

No entanto, preciso usar todos os três parâmetros - % de xargs , bem como $1 e $2 de quando o script é chamado no mesmo comando xargs . Alguma sugestão sobre a maneira apropriada de fazer isso, ou é xargs não é uma boa opção para isso?

    
por cutrightjm 04.08.2017 / 15:47

1 resposta

2

Em:

cat test | xargs -I% bash -c 'echo % $1 $2;'

$1 e $2 são passados como sequências literais no argumento para bash -c , que é o script embutido. E % também será expandido nesse script, portanto, tratado como código shell. Portanto, por exemplo, se test contiver ;reboot; , isso fará com que ele chame o comando reboot .

Você não está transmitindo argumentos para o script in-line, portanto, $1 , $2 estará vazio.

Você poderia fazer:

< test xargs -I% bash -c 'echo "$1" "$2" "$3"' bash % "$1" "$2"

Para encaminhar o argumento do seu script para o script in-line, mas se $1 ou $2 também contiverem % caracteres, eles também serão expandidos em xargs .

Você pode usar o ambiente para passar esses valores:

< test PARAM1=$1 PARAM2=$2 xargs -I% bash -c '
  echo "$1" "$PARAM1" "$PARAM2"' bash %

Observe também que xargs faz algum processamento de cotação na entrada, se você quiser que o conteúdo bruto de cada linha seja passado na íntegra, não é isso que você usaria. Com o GNU xargs , você poderia fazer:

< test xargs -d '\n' -n 1 bash -c 'echo "$3" "$1" "$2"' bash "$1" "$2"

Além disso, não se esqueça de citar suas variáveis. printf é mais confiável que echo , mas lembre-se que o primeiro argumento é o formato , então não deve ser variável .

    
por 04.08.2017 / 16:43