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