Jedną różnicą jest to, że w przypadku zastąpienia komendy zamiast potoku rozmiar przekazywanych danych jest ograniczony przez rozmiar bufora komend, dlatego w niektórych przypadkach jest on obcinany bez ostrzeżenia. Oznacza to również, że całe wyjście polecenia musi zostać wygenerowane i zapisane w pamięci, zanim zostanie przekazane do następnego polecenia, więc w przypadku dużych wyjść można użyć znacznie więcej pamięci, niż to konieczne.
Innym problemem związanym z pierwszą metodą jest to, że dane wyjściowe są dzielone na białe znaki, więc nie można obsługiwać nazw plików ze spacjami. xargs
ma również wpływ problem z białymi znakami, ale można to naprawić, zmieniając używany separator. Nawiasem mówiąc, aby poprawnie obsługiwać nazwy plików, w drugim przykładzie należy użyć bajtu zerowego jako separatora.
Trzeci problem polega na tym, że globusy są rozwinięte, więc jeśli plik ma gwiazdki lub znaki zapytania w swojej nazwie, nieoczekiwane wyniki.
Miłą dyskusję na ten temat można znaleźć tutaj: http://mywiki.wooledge.org/ParsingLs
Prawidłowa składnia to
echo rm *
lub jeśli musisz użyć xargs,
find . -maxdepth 1 -print0 | xargs -0 echo rm
Usuń, echo
gdy wynik wygląda poprawnie.
xargs
działa również w podpowłoce z powodu potoku, chyba że włączyszshopt -s lastpipe
, w którym to przypadku będzie działał w bieżącej powłoce. Nie sądzę jednak, aby działanie w podpowłoce stanowiło problem w tym przypadku, ponieważ nie zmieniasz żadnych zmiennych.-l
flagi, npfind . -maxdepth 1 -print0 | xargs -0 -l rm
. W przypadku drugiego pytania nie można używaćls
z,xargs -0
ponieważ ls nie dzieli wyniku na butlę zerową, ale z-0
opcji cierpi z powodu białych znaków.man xargs
, używajecho
do testowania, nierm
.xargs
pozwala nam przekroczyć limity powłoki (część bufora jest ograniczona do 65 KB, lista nazw plików nie jest).xargs --show-limits
a zobaczysz limit ustawiony w systemie,