Giới hạn ký tự dòng lệnh Linux


26

Tôi đang chuyển một biến cho một tập lệnh trên dòng lệnh. Giới hạn ký tự của một lệnh là gì? ví dụ:

$ MyScript reallyreallyreally...reallyreallyreallylongoption

Cảm ơn.


1
Tôi không hiểu câu hỏi. Bạn có quan tâm đến giới hạn của các nhân vật?
krissi

Bạn cần nói rõ hơn câu hỏi của bạn, nếu không nó sẽ bị đóng lại.
ThatGraemeGuy

Câu trả lời:


25

Giới hạn áp đặt shell / OS thường rất dài - thường là một hoặc hai trăm nghìn ký tự.

getconf ARG_MAXsẽ cung cấp cho bạn giới hạn đầu vào tối đa cho một lệnh. Trên hệ thống Debian hiện tại tôi có một thiết bị đầu cuối mở trên này trả về 131072 là 128 * 1024. Giới hạn được giảm bởi các biến môi trường của bạn như thể bộ nhớ của tôi phục vụ cho tôi một cách chính xác, chúng được truyền trong cùng một cấu trúc bởi vỏ, mặc dù điều đó sẽ chỉ mất vài trăm ký tự trong hầu hết các trường hợp. Để tìm một xấp xỉ của giá trị này chạy env | wc -c- điều này gợi ý 325 ký tự tại thời điểm hiện tại trên thông tin đăng nhập này trên máy này.

Các tập lệnh có khả năng cho phép toàn bộ chiều dài này, nhưng không có khả năng các tiện ích khác sẽ áp đặt các giới hạn của chính chúng hoặc cố ý hoặc thông qua các vấn đề thiết kế. Cũng có thể có các giới hạn nhân tạo về thời gian một đối số riêng lẻ trên một dòng lệnh dài có thể và / hoặc một đường dẫn đến một tệp có thể dài bao lâu.


2
Trên hệ thống của tôi, getconf ARG_MAXcung cấp 2097152, nhưng độ dài tối đa tôi có thể vượt qua vẫn là 131071 (và tôi không phải khấu trừ kích thước của môi trường).
Tạm dừng cho đến khi có thông báo mới.

1
Cũng nên nhớ điều đó xargsvà thậm chí find -execlà bạn bè của bạn khi xử lý các danh sách đối số khổng lồ.
coredump

@Dennis: giá trị được trả về getconflà mức kernel tôi nghĩ. Có lẽ bash đang đặt giới hạn thấp hơn bởi thiết kế / cấu hình của nó? Ngoài ra, kiến ​​thức của tôi về điều này xuất phát từ một thời gian trước đây nên có thể mọi thứ đã thay đổi một chút gần đây, mặc dù đó không phải là một lĩnh vực mà tôi mong đợi sẽ thấy rất nhiều chuyển động ngoại trừ trong các vỏ thử nghiệm mới.
David Spillett

Tôi nhận được kết quả tương tự trong ksh, zsh, dash, fishvà Bash 3 như tôi đã làm trong Bash 4. Các thông báo lỗi từ fishcó thể cung cấp thông tin: "cá: Tổng kích thước của danh sách đối số và môi trường (130kB) vượt quá giới hạn hệ điều hành của 2.0MB . " Tuy nhiên, set | wc -clà 306317 và env | wc -clà 2507 không tính đến sự khác biệt. Tôi không biết những gì khác đang được tính.
Tạm dừng cho đến khi có thông báo mới.


1

Bạn có nghĩa là chiều dài biến dài nhất là gì? Để tìm ra điều đó, bạn có thể sử dụng "x" của perl để tạo một tên biến rất dài:

 VAR=`perl -e 'print "a"x131071'` ; bash a.sh $VAR

Trên hệ thống của tôi 131071 hoạt động:

và biến được in ở 131072, nó quá lớn:

VAR=`perl -e 'print "a"x131072'` ; bash a.sh $VAR
bash: /bin/bash: Argument list too long

2
Trên thực tế đó là một giá trị biến rất dài .
Tạm dừng cho đến khi có thông báo mới.

3
Ngoài ra, bạn không phải sử dụng perlvà tập lệnh:/bin/echo "$(printf "%*s" 131071 ".")">/dev/null
Tạm dừng cho đến khi có thông báo mới.

@DennisWilliamson tuy nhiên, printf '%s\n' "$(printf '%*s' 131072 .)" >/dev/nullhoạt động.
jarno

Đó là bởi vì printfmột vỏ được tích hợp sẵn, do bashđó không cần phải thực hiện một exec()quá trình khác. ARG_MAXchỉ quan trọng đối với chiều dài của danh sách đối số của exechàm ( exec(), execl(), execlp(), execvp(), execvpe(), vv).
Vicente Olivert Riera
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.