Điều gì chi phối các giới hạn của mở rộng nẹp vỏ?


7

Trong ví dụ này tôi đề cập đến việc mở rộng một chuỗi các số nguyên, nhưng có lẽ (?) Các giới hạn sẽ phù hợp với tất cả các khía cạnh của mở rộng niềng răng .. Quan điểm chung hơn này cũng được tôi quan tâm.

seq dường như xử lý các chuỗi số nguyên dài hơn nhiều so với việc mở rộng dấu ngoặc {1..n} (ít nhất, đó là trường hợp trong ví dụ này).

ví dụ: 'seq -f @% 12.0f 1 1000000000> / dev / null' .. Điều này mở rộng 1 tỷ khá hạnh phúc trong 14m 04s

Tuy nhiên, echo {1..10000000000} >/dev/nullsự cố rơi vào quên lãng từ CLI trong 'gnome-terminal' và 'konsole' (... tạm biệt phiên cuối của thiết bị đầu cuối!)

Điều tốt nhất tôi có thể có được từ việc mở rộng cú đúp cho một chuỗi số nguyên, là khoảng {1..15000000} .. chỉ 15 triệu.

Đây có phải là một hạn chế của bản mở rộng niềng răng, hoặc về cách echoxử lý dữ liệu mở rộng? Có vẻ như nguyên nhân là do sử dụng hết RAM có sẵn, nhưng tôi nghĩ nó sẽ sử dụng swapvùng đó vào thời điểm đó ...

Ngoài ra (btw), chuỗi số nguyên 15000000 này, echo {..}mất 57.0s; trong khi seqchỉ mất 12,7 giây ...


Câu hỏi rất thú vị, nhưng tôi nghĩ rằng câu trả lời "thực sự" - nghĩa là vượt ra ngoài mối quan tâm học thuật - chắc chắn đây là một trong những dấu hiệu cho thấy đã đến lúc chuyển sang ngôn ngữ kịch bản .
mattdm

1
Bạn đang yêu cầu quá nhiều bộ nhớ từ bash. Trên máy của tôi, 10000000000 ngay lập tức bị bash bash: xmalloc: ../../../bash/lib/sh/stringvec.c:40: cannot allocate 11280523272 bytes (0 bytes allocated). (bash 3.2.39, amd64.) 15000000 gây ra quá nhiều trao đổi, vì vậy tôi đã giết nó. Bạn đang yêu cầu quá nhiều từ bash nghèo.
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


7

echo {1..5}được mở rộng thành lệnh echo 1 2 3 4 5sau đó được mở rộng theo cách thông thường. Nó hoàn toàn không giống với seq 1 1000000000 >/dev/null, nó không bao giờ mở rộng thành một lệnh với rất nhiều đối số.

Nó giống như echo $(seq 1 1000000000): Tôi đoán điều này phá vỡ theo cùng một cách?

Vấn đề bạn đang gặp phải là xử lý các lệnh lớn, điều mà Unix luôn gặp phải, đó là vấn đề chung với việc xử lý các chuỗi lệnh. Đó là một trong những điều Perl được viết để sửa chữa.

Tôi sẽ gửi một báo cáo lỗi lịch sự và thông tin: nó có thể gây ra một cuộc thảo luận thú vị.


Cảm ơn câu trả lời. Nhận xét của bạn, "Nó hoàn toàn không giống với seq ..." đưa mọi thứ vào tình trạng giảm nhẹ; đồng xu giảm ... Tôi vừa mới Alt-Tabbed để kiểm tra tiến trình của mình echo $(seq 1 1000000000), nhưng Terminal đã biến mất :) ... Vì vậy, tôi tập hợp rằng không có gì để làm cụ thể với echoviệc mở rộng hoặc tăng tốc. và đó chỉ đơn giản là vấn đề hết RAM ... btw, vấn đề này nảy sinh từ câu hỏi này: unix.stackexchange.com/questions/8273/ Lỗi
Peter.O

@fred: Đó có thể là lỗi seg phát sinh từ một số lỗi tràn bộ đệm nội bộ hoặc có thể là một số giới hạn hệ điều hành bị vượt quá và chương trình không xử lý tình trạng lỗi một cách duyên dáng. Lưu ý rằng việc mở rộng được thực hiện bởi shell chứ không phải thiết bị đầu cuối. Có lẽ các chương trình thiết bị đầu cuối của bạn có cài đặt "không đóng trên thoát khỏi vỏ"? Bằng cách này bạn có thể thấy vỏ thoát ra như thế nào.
Charles Stewart

1

Tôi đoán việc mở rộng này không được thiết kế để được sử dụng theo cách đó. Sự cố cho thấy một lỗi, chắc chắn, nhưng hiếm khi gây ra một lỗi.

Bạn nghĩ nó thực tế đến mức nào để nuôi hàng tỷ số nguyên liên tiếp cho bất cứ thứ gì?


2
Nó không chỉ thực tế, nó rất cần thiết khi bạn cần ... Có phải các nhà thiết kế seqkhông thực tế? nó có thể tăng thứ tự cường độ cao hơn ... Có thực tế không? hoàn toàn (khi bạn cần), nó có hiếm không? Tôi không biết, nhưng tôi nghi ngờ như vậy .. nhưng một chiếc xe tải trên đường cao tốc bạn không thấy cũng hiếm, nhưng nó khá quan trọng :) ... Tuy nhiên, tôi cần nó ngay bây giờ, và tôi đang tìm kiếm tùy chọn tốt nhất ... Do sự cố 'chuỗi số nguyên' này, nó đã gây ra một câu hỏi rộng hơn .. "Điều gì chi phối các giới hạn của việc mở rộng nẹp vỏ?"
Peter.O

@alex: Đây thực sự không phải là một câu trả lời cho câu hỏi, nhưng một cách gợi ý rằng câu hỏi không đáng để hỏi.
iconoclast

1
Đây thực sự không phải là một bình luận.
alex
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.