Executando linhas de um arquivo com xargs, usando redirecionamento stdout

3

Eu tenho um arquivo com linhas parecidas com esta:

"http://api.domain.com/path/to/resource?format=json" > output.xml

e eu executo o seguinte na minha linha de comando:

cat file | xargs -L 1 -I {} wget {}

Infelizmente, o comando parece que é executado, mas nenhum arquivo é criado. Quando eu uso o comando:

cat file | xargs -L 1 -I {} echo {}

Imprime as linhas do arquivo sem as aspas duplas. Eu acho que isso pode ser a fonte do problema. Como faço para incluí-los?

Como posso executar corretamente o comando wget ?

    
por dougvk 13.02.2012 / 21:16

1 resposta

1

Citações, operadores de redirecionamento, etc. são tipicamente analisados pelo shell antes da construção da matriz argv []. > é removido; o shell realiza o redirecionamento. Citações são removidas; o shell executa a divisão de palavras.

Com xargs , toda a linha de entrada vai diretamente para argv [], com as aspas e os operadores sendo passados para wget, que não tem ideia do que fazer com eles.

Para analisar esses arquivos de entrada como você, você precisará obter ajuda do shell, de duas maneiras possíveis.

< file xargs -d '\n' -I {} sh -x -c "wget {}"

Desta forma, file está sendo lido linha por linha sem permitir que xargs faça qualquer divisão ( -d '\n' ) e passada para o shell sh como parte de uma linha de comando. A opção -x para sh permite ver comandos executados.

while read -r line; do
    eval "wget $line"
done < file

Aqui o mesmo é feito usando apenas builtins do shell atual - sh , bash ou compatível.

    
por 13.02.2012 / 22:20

Tags