Ketika saya menjalankan perintah seperti ls */*/*/*/*.jpg
, saya mendapatkan kesalahan
-bash: /bin/ls: Argument list too long
Saya tahu mengapa hal ini terjadi: itu karena ada batas kernel pada jumlah ruang untuk argumen ke perintah. Saran standar adalah mengubah perintah yang saya gunakan, untuk menghindari membutuhkan begitu banyak ruang untuk argumen (misalnya, gunakan find
dan xargs
).
Bagaimana jika saya tidak ingin mengubah perintah? Bagaimana jika saya ingin tetap menggunakan perintah yang sama? Bagaimana saya bisa membuat hal-hal "hanya berfungsi", tanpa mendapatkan kesalahan ini? Solusi apa yang tersedia?
Jawaban:
Di Linux, jumlah ruang maksimum untuk argumen perintah adalah 1/4 dari jumlah ruang tumpukan yang tersedia. Jadi, solusinya adalah meningkatkan jumlah ruang yang tersedia untuk tumpukan.
Versi singkat: jalankan sesuatu seperti
Versi yang lebih panjang: Jumlah ruang default yang tersedia untuk stack adalah sekitar 8192 KB. Anda dapat melihat jumlah ruang yang tersedia, sebagai berikut:
Pilih jumlah yang lebih besar, dan atur jumlah ruang yang tersedia untuk tumpukan. Misalnya, jika Anda ingin mencoba mengizinkan hingga 65536 KB untuk tumpukan, jalankan ini:
Anda mungkin perlu bermain-main dengan seberapa besar ini perlu, menggunakan coba-coba. Dalam banyak kasus, ini adalah solusi cepat-dan-kotor yang akan menghilangkan kebutuhan untuk memodifikasi perintah dan bekerja keluar sintaks
find
,xargs
dll (meskipun saya menyadari ada manfaat lain untuk melakukannya).Saya percaya ini khusus untuk Linux. Saya menduga itu mungkin tidak akan membantu pada sistem operasi Unix lain (tidak diuji).
sumber
Ini artikel Linux Journal memberikan 4 solusi. Hanya solusi keempat yang tidak melibatkan mengubah perintah:
Saya setuju bahwa batasannya sangat mengganggu.
sumber
Alih-alih
ls */*/*/*/*.jpg
, coba:xargs
(1) tahu, berapa jumlah maksimum argumen pada sistem dan akan memecah input standar untuk memanggil baris perintah yang ditentukan beberapa kali dengan tidak ada argumen lebih dari batas itu, apa pun itu (Anda juga dapat mengaturnya lebih rendah dari maksimum OS menggunakan-n
opsi).Sebagai contoh, anggaplah, batasnya adalah 3 argumen dan Anda memiliki lima file. Dalam hal ini
xargs
akan dieksekusils
dua kali:ls 1.jpg 2.jpg 3.jpg
ls 4.jpg 5.jpg
Seringkali ini sangat cocok, tetapi tidak selalu - misalnya, Anda tidak dapat mengandalkan
ls
(1) menyortir semua entri untuk Anda dengan benar, karena masing-masingls
-invokasi terpisah akan mengurutkan hanya sebagian dari entri yang diberikan kepadanyaxargs
.Meskipun Anda dapat menabrak batas seperti yang disarankan oleh orang lain, masih akan ada batas - dan suatu hari koleksi JPG Anda akan melebihi itu lagi. Anda harus menyiapkan skrip Anda untuk menangani jumlah tak terbatas ...
sumber
Argument list too long
, tetapi untukecho
bukannyals
, pada shell di manaecho
tidak ada perintah built-in shell? (Mungkin itu bukan masalah di sebagian besar kerang, jadi mungkin itu tidak relevan.)find
dengan-print0
predikat - dan pipa outputnya ke dalamxargs
dengan-0
pilihan.echo
adalah shell built-in dan tidak mengalami batasan baris perintahexec
(3).