A diferença está em quais dados o programa alvo está aceitando.
Se você acabou de usar um pipe, ele recebe dados em STDIN (o fluxo de entrada padrão) como uma pilha de dados que pode ser classificada em uma linha por vez. No entanto, alguns programas não aceitam seus comandos no padrão, eles esperam que seja soletrado nos argumentos para o comando. Por exemplo, touch
recebe um nome de arquivo como um parâmetro na linha de comando da seguinte forma: touch file1.txt
.
Se você tem um programa que gera nomes de arquivos no padrão e deseja usá-los como argumentos para touch
, você precisa usar xargs
, que lê o nome STDIN stream data e converte cada linha em espaços separados por argumentos para o comando.
Essas duas coisas são equivalentes:
# touch file1.txt
# echo file1.txt | xargs touch
Não use xargs
a menos que você saiba exatamente o que está fazendo e por que é necessário. É bem comum que haja uma maneira melhor de fazer o trabalho do que usar xargs
para forçar a conversão. O processo de conversão também é repleto de possíveis armadilhas, como fuga e expansão de palavras, etc.