Una diferencia es que cuando se usa la sustitución de comandos en lugar de una tubería, el tamaño de los datos pasados está limitado por el tamaño del búfer de comandos, por lo que en algunos casos se trunca sin advertencia. Esto también significa que toda la salida del comando debe producirse y almacenarse en la memoria antes de pasar al siguiente comando, por lo que para salidas grandes puede usar mucha más memoria de la necesaria.
Otro problema con el primer método es que la salida se divide en espacios en blanco, por lo que no puede manejar nombres de archivos con espacios en ellos. xargs
también se ve afectado por el problema del espacio en blanco, pero se puede solucionar cambiando el delimitador utilizado. Por cierto, para manejar adecuadamente los nombres de archivo, necesitaría usar el byte nulo como delimitador en el segundo ejemplo.
Un tercer problema es que los globos se expanden, por lo que si un archivo tiene asteriscos o signos de interrogación en su nombre, habrá resultados inesperados.
Puede encontrar una buena discusión sobre el tema aquí: http://mywiki.wooledge.org/ParsingLs
La sintaxis correcta sería
echo rm *
o si debes usar xargs,
find . -maxdepth 1 -print0 | xargs -0 echo rm
Eliminar echo
cuando la salida se vea correcta.
xargs
también se ejecuta en un subshell debido a la tubería, a menos que habiliteshopt -s lastpipe
, en cuyo caso se ejecutará en el shell actual. Sin embargo, no creo que ejecutar un subshell sea un problema en este caso, ya que no está cambiando ninguna variable.-l
bandera, comofind . -maxdepth 1 -print0 | xargs -0 -l rm
. Para la segunda pregunta, no se puede usarls
conxargs -0
porque ls no divide la salida en el bute nulo, sino con líneas nuevas (que son válidas en los nombres de archivo BTW)-0
opción sufre el problema del espacio en blanco.man xargs
, usarecho
para probar, norm
.xargs
nos permite superar los límites de shell (algunos búferes están limitados a 65K, una lista de nombres de archivos no).xargs --show-limits
y verá el límite establecido en su sistema,