Diferença entre “xargs” e substituição de comandos?

11

Em muitos casos, uso substituição de comando em vez de xargs . Por exemplo, rm $(ls) é o mesmo que ls | xargs rm

Quais são realmente as diferenças entre eles?

Acho que uma das diferenças é que a substituição de comandos é executada em subshell, enquanto xargs é executada no shell atual, mas não tenho certeza.

Por favor, liste as diferenças.

    
por Sinoosh 01.10.2016 / 09:18

1 resposta

9

Uma diferença é que ao usar a substituição de comando em vez de um canal, o tamanho dos dados transmitidos é limitado pelo tamanho do buffer de comando, portanto, ele é truncado em alguns casos sem aviso. Isso também significa que toda a saída do comando deve ser produzida e armazenada na memória, antes de ser passada para o próximo comando, portanto, para saídas grandes, é possível usar muito mais memória do que o necessário.

Outro problema com o primeiro método é que a saída é dividida em espaço em branco, portanto você não pode manipular nomes de arquivos com espaços neles. xargs também é afetado pelo problema de espaço em branco, mas pode ser corrigido alterando o delimitador usado. Para manipular corretamente nomes de arquivos, você precisaria usar o byte nulo como um delimitador no segundo exemplo.

Um terceiro problema é que os globs são expandidos, portanto, se um arquivo tiver asteriscos ou pontos de interrogação em seu nome, haverá resultados inesperados.

Você pode encontrar uma boa discussão sobre o assunto aqui: link

A sintaxe correta seria

echo rm *

ou se você precisar usar xargs,

find . -maxdepth 1 -print0 | xargs -0 echo rm

Remova echo quando a saída parece correta.

    
por user000001 01.10.2016 / 11:05

Tags