Có tối đa để bash mở rộng tên tập tin (globalbing) và nếu vậy, nó là gì?


11

Có tối đa để bash mở rộng tên tập tin (globalbing) và nếu vậy, nó là gì? Xem globbing trên tldp.org.

Giả sử tôi muốn chạy một lệnh đối với tập hợp con các tệp:

grep -e bar foo*
rm -f bar*

Có giới hạn đối với bao nhiêu tệp bash sẽ mở rộng ra không, và nếu vậy nó là gì?

Tôi không tìm kiếm các cách khác để thực hiện các hoạt động đó (ví dụ: bằng cách sử dụng find).



2
Xem thêm: Điều gì xác định kích thước tối đa cho một đối số lệnh? Trên các hệ thống Linux hiện tại, có các giới hạn khác nhau cho kích thước của một đối số và cho tổng kích thước. Cái sau phụ thuộc vào giới hạn kích thước ngăn xếp.
ilkkachu

Câu trả lời:


17

Không có giới hạn (ngoài bộ nhớ khả dụng) đối với số lượng tệp có thể được mở rộng bởi toàn bashcầu.

Tuy nhiên, khi các tệp đó được truyền dưới dạng đối số cho một lệnh được thực thi (trái ngược với hàm dựng sẵn hoặc hàm), thì bạn có thể gặp phải giới hạn của lệnh execve()gọi hệ thống trên một số hệ thống. Trên hầu hết các hệ thống, lệnh gọi hệ thống đó có giới hạn về kích thước tích lũy của các đối số và môi trường được truyền cho nó và trên Linux cũng có một giới hạn riêng về kích thước của một đối số.

Để biết thêm chi tiết, xem:

Để khắc phục giới hạn đó, bạn có thể sử dụng (giả sử GNU xargshoặc tương thích):

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

Ở trên, vì printfđược tích hợp (trong bashvà hầu hết các vỏ giống như Bourne), chúng tôi không đạt đến execve()giới hạn. Và xargssẽ chia danh sách các đối số thành nhiều rmlời mời nếu cần để tránh execve()giới hạn.

Với zsh:

autoload zargs
zargs foo* -- rm -f

Với ksh93:

command -x rm -f foo*

7

Bạn có thể thấy giới hạn cho tổng kích thước của các đối số với:

getconf ARG_MAX

Điều này thường được xác định không phải bởi trình bao, mà bởi hệ điều hành cơ bản theo câu trả lời này .


2
Tôi nghĩ đó là tổng chiều dài, không phải số lượng?
ilkkachu

1
Bạn đung, di nhiên; Tôi đã cập nhật câu trả lời của tôi để phản ánh điều này. Do đó, giới hạn số lượng đối số sẽ là một hàm theo độ dài của các đối số.
DopeGhoti
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.