Apakah ada maksimum untuk ekspansi nama file bash (globbing) dan jika demikian, apakah itu?


11

Apakah ada maksimal untuk ekspansi nama file bash (globbing) dan jika demikian, apakah itu? Lihat globbing di tldp.org.

Katakanlah saya ingin menjalankan perintah terhadap subset file:

grep -e bar foo*
rm -f bar*

Apakah ada batasan berapa banyak file yang akan diperluas bash, dan jika ya, apa itu?

Saya tidak mencari cara alternatif untuk melakukan operasi tersebut (misalnya dengan menggunakan find).



2
Lihat juga: Apa yang menentukan ukuran maksimum untuk satu argumen perintah? Pada sistem Linux saat ini, ada batas yang berbeda untuk ukuran argumen tunggal, dan untuk ukuran total. Yang terakhir tergantung pada batas ukuran tumpukan.
ilkkachu

Jawaban:


17

Tidak ada batasan (selain memori yang tersedia) untuk jumlah file yang dapat diperluas oleh bashglob.

Namun ketika file-file itu dilewatkan sebagai argumen untuk perintah yang dieksekusi (sebagai lawan dari builtin shell atau fungsi), maka Anda dapat mengalami batas execve()panggilan sistem pada beberapa sistem. Pada kebanyakan sistem, pemanggilan sistem itu memiliki batasan ukuran kumulatif argumen dan lingkungan yang diteruskan ke sana, dan di Linux juga ada batasan terpisah pada ukuran argumen tunggal.

Untuk detail lebih lanjut, lihat:

Untuk mengatasi batas itu, Anda dapat menggunakan (dengan asumsi GNU xargsatau kompatibel):

printf '%s\0' foo* | xargs -r0 rm -f

Di atas, karena printfbuilt-in (di bashdan sebagian besar shell Bourne-like), kami tidak mencapai execve()batasnya. Dan xargsakan membagi daftar argumen menjadi rmdoa sebanyak yang diperlukan untuk menghindari execve()batasan.

Dengan zsh:

autoload zargs
zargs foo* -- rm -f

Dengan ksh93:

command -x rm -f foo*

7

Anda dapat melihat batas ukuran total argumen dengan:

getconf ARG_MAX

Ini ditentukan umumnya bukan oleh shell, tetapi oleh sistem operasi yang mendasarinya sesuai dengan jawaban ini .


2
Saya pikir itu panjang total, bukan jumlahnya?
ilkkachu

1
Anda tentu saja benar; Saya telah memperbarui jawaban saya untuk mencerminkan ini. Karena itu, batas jumlah argumen akan menjadi fungsi dari panjang argumen.
DopeGhoti
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.