Одно из отличий заключается в том, что при использовании подстановки команд вместо канала размер передаваемых данных ограничивается размером буфера команд, поэтому в некоторых случаях он усекается без предупреждения. Это также означает, что весь вывод команды должен быть произведен и сохранен в памяти, прежде чем он будет передан следующей команде, поэтому для больших выходных данных вы можете использовать гораздо больше памяти, чем необходимо.
Еще одна проблема, связанная с первым методом, заключается в том, что выходные данные разделяются на пробелы, поэтому вы не можете обрабатывать имена файлов с пробелами в них. xargs
На проблему также влияют пробельные символы, но ее можно исправить, изменив используемый разделитель. Кстати, чтобы правильно обрабатывать имена файлов, вам нужно будет использовать нулевой байт в качестве разделителя во втором примере.
Третья проблема заключается в том, что глобусы расширяются, поэтому, если в имени файла есть звездочки или вопросительные знаки, будут неожиданные результаты.
Вы можете найти хорошую дискуссию по этому вопросу здесь: http://mywiki.wooledge.org/ParsingLs
Правильный синтаксис будет
echo rm *
или если вы должны использовать Xargs,
find . -maxdepth 1 -print0 | xargs -0 echo rm
Удалить, echo
когда вывод выглядит правильно.
xargs
также запускается в подоболочке из-за канала, если вы не включите егоshopt -s lastpipe
, и в этом случае он будет работать в текущей оболочке. Я не думаю, что запуск в подоболочке является проблемой, хотя в этом случае, поскольку вы не меняете никаких переменных.-l
флаг, напримерfind . -maxdepth 1 -print0 | xargs -0 -l rm
. Что касается второго вопроса, вы не можете использоватьls
с,xargs -0
потому что ls не разделяет вывод на нулевой бут, но с символами новой строки (которые действительны в именах файлов BTW)-0
опции страдает проблемой пробелов.man xargs
, использоватьecho
для тестирования, нетrm
.xargs
позволяет нам превышать пределы оболочки (некоторый буфер ограничен 65K, список имен файлов - нет).xargs --show-limits
и вы увидите ограничение, установленное в вашей системе,