Được rồi, hàng chục người. Vì vậy, tôi đã chấp nhận giới hạn độ dài dòng lệnh như phúc âm trong một thời gian khá dài. Vì vậy, phải làm gì với các giả định của một người? Đương nhiên- hãy kiểm tra chúng.
Tôi có một máy Fedora 22 theo ý của mình (nghĩa là: Linux với bash4). Tôi đã tạo một thư mục với 500.000 inodes (tệp) trong đó, mỗi inodes dài 18 ký tự. Độ dài dòng lệnh là 9.500.000 ký tự. Được tạo ra như vậy:
seq 1 500000 | while read digit; do
touch $(printf "abigfilename%06d\n" $digit);
done
Và chúng tôi lưu ý:
$ getconf ARG_MAX
2097152
Tuy nhiên, lưu ý rằng tôi có thể làm điều này:
$ echo * > /dev/null
Nhưng điều này không thành công:
$ /bin/echo * > /dev/null
bash: /bin/echo: Argument list too long
Tôi có thể chạy vòng lặp for:
$ for f in *; do :; done
là một nội trang shell khác.
Đọc kỹ tài liệu đểARG_MAX
biết các trạng thái, Độ dài tối đa của đối số cho các hàm thực thi . Điều này có nghĩa là: Không cần gọi exec
, không có ARG_MAX
giới hạn. Vì vậy, nó sẽ giải thích tại sao nội trang vỏ không bị hạn chế bởi ARG_MAX
.
Và thực sự, tôi có thể ls
thư mục của mình nếu danh sách đối số của tôi dài 109948 tệp hoặc khoảng 2.089.000 ký tự (cho hoặc nhận). Tuy nhiên, khi tôi thêm một tệp tên tệp 18 ký tự nữa, tôi nhận được lỗi Danh sách đối số quá dài . Vì vậy, ARG_MAX
nó đang hoạt động như được quảng cáo: trình thực thi không thành công với nhiều hơn ARG_MAX
ký tự trong danh sách đối số - bao gồm, cần lưu ý, dữ liệu môi trường.