web-dev-qa-db-fra.com

Différence entre "xargs" et substitution de commande?

Dans de nombreux cas, j'utilise la substitution de commande au lieu de xargs. Par exemple, rm $(ls) est identique à ls | xargs rm

Quelles sont vraiment les différences entre eux?

Je pense qu’une des différences est que la substitution de commande s’exécute dans le sous-shell alors que xargs s’exécute dans le Shell actuel, mais je ne suis pas sûr.

Veuillez énumérer les différences.

13
Sinoosh

Une différence est que lorsqu’on utilise la substitution de commande au lieu d’un canal, la taille des données transmises est limitée par la taille du tampon de commande; elle est donc tronquée dans certains cas sans aucun avertissement. Cela signifie également que l'intégralité de la sortie de la commande doit être produite et stockée en mémoire avant d'être transmise à la commande suivante. Vous pouvez donc utiliser beaucoup plus de mémoire que nécessaire pour les sorties volumineuses.

Un autre problème avec la première méthode est que la sortie est divisée en espaces, vous ne pouvez donc pas gérer les noms de fichiers contenant des espaces. xargs est également affecté par le problème des espaces, mais il peut être corrigé en modifiant le délimiteur utilisé. Soit dit en passant, pour gérer correctement les noms de fichiers, vous devez utiliser l'octet null en tant que délimiteur dans le deuxième exemple.

Un troisième problème est que les objets globaux sont développés. Ainsi, si un fichier a un astérisque ou un point d'interrogation dans son nom, il obtiendra des résultats inattendus.

Vous pouvez trouver une discussion intéressante sur la question ici: http://mywiki.wooledge.org/ParsingLs

La syntaxe correcte serait

echo rm *

ou si vous devez utiliser xargs,

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

Supprimez echo lorsque la sortie semble correcte.

9
user000001