Satu perbedaan adalah bahwa ketika menggunakan substitusi perintah bukannya pipa, ukuran data yang dikirimkan dibatasi oleh ukuran buffer perintah, sehingga terpotong dalam beberapa kasus tanpa peringatan. Ini juga berarti bahwa seluruh output perintah harus diproduksi, dan disimpan dalam memori, sebelum diteruskan ke perintah berikutnya, jadi untuk output besar Anda dapat menggunakan lebih banyak memori daripada yang diperlukan.
Masalah lain dengan metode pertama adalah bahwa output dibagi pada spasi putih, jadi Anda tidak bisa menangani nama file dengan spasi di dalamnya. xargs
juga dipengaruhi oleh masalah spasi putih, tetapi bisa diperbaiki dengan mengubah pembatas yang digunakan. Untuk menangani nama file dengan benar, Anda harus menggunakan byte nol sebagai pembatas pada contoh kedua.
Masalah ketiga adalah bahwa gumpalan diperluas, jadi jika file memiliki tanda bintang atau tanda tanya dalam namanya, akan ada hasil yang tidak terduga.
Anda dapat menemukan diskusi yang bagus tentang masalah ini di sini: http://mywiki.wooledge.org/ParsingLs
Sintaks yang benar adalah
echo rm *
atau jika Anda harus menggunakan xargs,
find . -maxdepth 1 -print0 | xargs -0 echo rm
Hapus echo
ketika output terlihat benar.
xargs
juga berjalan dalam subkulit karena pipa, kecuali jika Anda mengaktifkanshopt -s lastpipe
, dalam hal ini akan berjalan di shell saat ini. Saya tidak berpikir bahwa menjalankan dalam subkulit adalah masalah meskipun dalam kasus ini, karena Anda tidak mengubah variabel apa pun.-l
flag, sepertifind . -maxdepth 1 -print0 | xargs -0 -l rm
. Untuk pertanyaan kedua, Anda tidak dapat menggunakanls
denganxargs -0
karena ls tidak membagi output pada null bute, tetapi dengan baris baru (yang valid dalam nama file BTW)-0
opsi menderita masalah spasi putih.man xargs
, gunakanecho
untuk pengujian, bukanrm
.xargs
memungkinkan kita melampaui batas shell (beberapa buffer dibatasi hingga 65K, daftar nama file tidak).xargs --show-limits
dan Anda akan melihat batas yang ditetapkan pada sistem Anda,