Ein Unterschied besteht darin, dass bei Verwendung der Befehlssubstitution anstelle einer Pipe die Größe der übergebenen Daten durch die Größe des Befehlspuffers begrenzt wird, sodass in einigen Fällen keine Warnung ausgegeben wird. Dies bedeutet auch, dass die gesamte Befehlsausgabe erstellt und gespeichert werden muss, bevor sie an den nächsten Befehl übergeben wird. Für große Ausgaben können Sie also viel mehr Speicher als erforderlich verwenden.
Ein weiteres Problem bei der ersten Methode ist, dass die Ausgabe in Leerzeichen aufgeteilt wird, sodass Sie keine Dateinamen mit Leerzeichen verarbeiten können. xargs
ist ebenfalls vom Leerzeichenproblem betroffen, kann jedoch durch Ändern des verwendeten Trennzeichens behoben werden. Um Dateinamen im Übrigen richtig zu behandeln, müssten Sie im zweiten Beispiel das Null-Byte als Trennzeichen verwenden.
Ein drittes Problem ist, dass Globs erweitert werden. Wenn eine Datei also Sternchen oder Fragezeichen im Namen enthält, kommt es zu unerwarteten Ergebnissen.
Eine nette Diskussion zu diesem Thema finden Sie hier: http://mywiki.wooledge.org/ParsingLs
Die richtige Syntax wäre
echo rm *
oder wenn Sie xargs verwenden müssen,
find . -maxdepth 1 -print0 | xargs -0 echo rm
Entfernen Sie, echo
wenn die Ausgabe korrekt aussieht.
xargs
aufgrund der Pipe auch in einer Subshell ausgeführt, sofern Sie dies nicht aktivierenshopt -s lastpipe
. In diesem Fall wird die Pipe in der aktuellen Shell ausgeführt. Ich denke nicht, dass das Ausführen in einer Subshell in diesem Fall ein Problem ist, da Sie keine Variablen ändern.-l
Flag verwenden, zfind . -maxdepth 1 -print0 | xargs -0 -l rm
. Für die zweite Frage können Sie nichtls
mit verwenden,xargs -0
da ls die Ausgabe nicht auf den Nullwert aufteilt, sondern mit Zeilenumbrüchen (die in Dateinamen BTW gültig sind)-0
Option leidet unter dem Whitespace-Problem.man xargs
,echo
zum Testen verwenden, nichtrm
.xargs
Lassen Sie uns die Shell-Grenzen überschreiten (einige Puffer sind auf 65 KB beschränkt, eine Liste mit Dateinamen nicht).xargs --show-limits
und sehen, welches Limit auf Ihrem System eingestellt ist.