Одна відмінність полягає в тому, що при використанні підстановки команд замість труби розмір переданих даних обмежується розміром буфера команд, тому він урізається в деяких випадках без попередження. Це також означає, що цілий вихід команди повинен бути вироблений і збережений у пам'яті, перш ніж він буде переданий наступній команді, тому для великих виходів можна використовувати набагато більше пам'яті, ніж потрібно.
Інша проблема першого методу полягає в тому, що вихід розбивається на пробіли, тому ви не можете обробляти назви файлів з пробілами в них. xargs
також впливає проблема пробілу, але її можна виправити, змінивши використаний роздільник. Щоб правильно обробляти назви файлів, до речі, вам потрібно буде використовувати нульовий байт як роздільник у другому прикладі.
Третє питання полягає в тому, що глобуси розширені, тому якщо у файлі зірочки чи знаки запитань у своєму імені, несподівані результати будуть.
Ви можете знайти приємну дискусію з цього питання тут: http://mywiki.wooledge.org/ParsingLs
Правильний синтаксис був би
echo rm *
або якщо вам потрібно використовувати xargs,
find . -maxdepth 1 -print0 | xargs -0 echo rm
Видаліть, echo
коли вихід виглядає правильним.
xargs
також працює в нижній частині корпусу через трубу, якщо ви не включитеshopt -s lastpipe
, і в цьому випадку вона буде працювати в поточній оболонці. Я не вважаю, що запуск в підпакеті не є проблемою, хоча в цьому випадку ви не змінюєте жодних змінних.