man xargs diz que a entrada padrão é delimitada por espaços em branco; mas é isso?

3

Estou confuso com o que realmente define um arg em xargs .
A man page parece sugerir que args são delimitados por espaços em branco (suponho que isso signifique espaço em branco). No entanto, o script a seguir não se comporta como seria de esperar. Aqui está um trecho da seção DESCRIÇÃO do homem:

xargs reads items from the standard input, delimited by blanks (which can be protected with double or single quotes or a backslash) or new‐lines, and executes the command ...

Parece que talvez o xargs trabalhe em blocos do que o man-page chama itens . Isso significa um item null-delimited ou newline ?

Basicamente, não entendo por que, no script a seguir, xargs trata a entrada como um único argumento, mesmo que os espaços (em stdin) não estejam protegidos . Eu esperava xargs para tratar stdin como 3 args, ou pelo menos reduzir vários espaços para um único espaço, mas não faz nenhum destes!

#!/bin/bash
if [[ $1 == "." ]] ;then  # act on a recursive call to self
    shift                 # scrap the 'recursive' arg
    printf '|%s|\n' "$@"  # print all 'xargs' args
    printf '|%s|\n' "$1"  # print only the first 'xargs' arg
    exit
fi
printf 'a    b    c\n' |xargs -I {} "$0" "." {}   

Aqui está a saída; mostrando apenas um único argumento foi passado para o script.

|a    b    c|
|a    b    c|

Mas eu esperava três argumentos separados, como este:

|a|
|b|
|c|
    
por Peter.O 19.01.2012 / 00:48

3 respostas

4

Leia o que a página de manual diz sobre a opção -I , que você está usando:

-I replace-str

Replace occurrences of replace-str in the initial-arguments with names read from standard input. Also, unquoted blanks do not terminate input items; instead the separator is the newline character.

    
por 19.01.2012 / 01:00
3

Não, isso não é sobre "blocos" versus "itens", isso é apenas mudar a terminologia. xargs recebe a entrada com ' ou " e delimita por espaços em branco, exceto quando certas opções são passadas.

Algumas opções mudam para processamento linha por linha sem citar: -I , -L , -i (GNU), -l (GNU). A opção -0 (quando disponível) é alterada para entrada delimitada por nulo sem cotação. A opção -d (GNU) muda para um delimitador personalizado sem cotação.

    
por 19.01.2012 / 01:09
-1

Uma das razões para criar o GNU Parallel foi torná-lo mais previsível que o xargs. link

Se você for atropelado pela maneira como os xargs interpretam os argumentos, considere o uso do GNU Parallel.

Você pode instalar o GNU Parallel simplesmente por:

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: link

    
por 09.05.2012 / 23:18

Tags