xargs vs backtick

1

Mais perguntas tolas do Linux n00b. = D

Estou curioso sobre as ramificações de desempenho do uso de xargs vs. backticks.

Por exemplo, qual é a diferença entre:

find ./ -name foo* | xargs rm

e

rm 'find ./ -name foo*'

Parece-me que seria uma prática melhor canalizar e usar xargs, já que o material poderia ser processado em ordem seqüencial.

Seus pensamentos?

-M

    
por Mike B 03.11.2009 / 04:38

3 respostas

2

Backticks prejudicam quando se lida com scripts mais complexos; você precisa cuidadosamente evitar o conteúdo de backticks. Por causa disso, eu frequentemente os mudo para $(...) .

xargs pode chamar rm várias vezes no seu exemplo se houver muitos arquivos - os sistemas POSIX podem ter limite superior no comprimento dos parâmetros de comando.

xargs tem outros recursos que os backticks não oferecem: por exemplo, xargs pode pegar os parâmetros separados por %code% byte para lidar com nomes de arquivos com espaços.

    
por 03.11.2009 / 05:27
2

Se você está lidando apenas com alguns nomes de caminhos que não contêm espaço em branco, eles são equivalentes.

Em alguns sistemas, o comprimento máximo de uma única linha de comando (na verdade, ambiente mais argumentos enviados para uma chamada exec (2) -familiar) é limitado (veja kern.argmax). Em um sistema limitado, se find produzir muita saída, o shell não conseguirá encaixar tudo na linha de comando adjacente. Para corrigir isso, xargs pega a saída de find e combina as "palavras" (sim, palavras, não linhas, veja abaixo) em grupos que se encaixam em uma única linha de comando.

Segundo, xargs e o shell (via backticks) dividirão a saída de find nos argumentos para rm , tokenizando a saída em cada execução de qualquer combinação de espaço, tabulação ou caracteres de nova linha ( isso é uma simplificação, pois ambos têm suas próprias regras de cotação que são próximas, mas não idênticas). Se find -print s um nome de caminho de ".//foo/bar quux", rm acabará por ver dois argumentos (".//foo/bar" e "quux"). Se um arquivo chamado quux existisse no cwd do qual você começou, ele desapareceria quando tudo estivesse terminado (e “.//foo/bar quux” ainda estaria lá!).

Portanto, o método mais robusto é usar find -print0 e xargs -0 POSIX-extension. Trabalhando juntos, eles podem ser usados para transportar de forma robusta qualquer nome de caminho legal da saída de find para a linha de comando de qualquer outro comando em qualquer sistema que suporte as duas extensões.

find . -name foo\* | xargs -0 rm

A robustez vem do fato de que o byte NUL que ambas as extensões usam para finalizar nomes de caminho é o único byte não permitido em praticamente todos os SOs (Unix-oid).

    
por 03.11.2009 / 06:43
1

Se o programa suportar vários argumentos nessa ordem, os backticks deverão ser idênticos. Como nem todos os programas suportam vários argumentos como esse, o problema surge quando um comando nos backticks é executado e retorna vários resultados. Se você souber que o último comando funcionará, use-o. Se você não tiver certeza, use o xargs para estar seguro. find também tem uma opção -exec útil que pode ser usada assim:

find / -type f -exec grep -i word {} +

em que as chaves são substituídas pela correspondência de arquivo atual de find .

    
por 03.11.2009 / 04:53