Làm thế nào thông minh là tiện ích unix?


8

Các tiện ích Unix như sort, find, grep, diff et al rất tiện dụng để thực hiện các tác vụ nhanh, đôi khi không cần viết bất kỳ mã nào cả.

Tôi muốn biết những thuật toán nào họ sử dụng trong nội bộ và làm thế nào để thông minh quyết định một thuật toán cụ thể cho một nhiệm vụ cụ thể? Ví dụ: nếu sort có được một tệp đầu vào lớn, nó sẽ sử dụng các thuật toán khác nhau cho các kích thước dữ liệu khác nhau?

Liệu grep có chuyển đổi thuật toán một cách thông minh trong khi tìm kiếm các tập dữ liệu khác nhau không?


4
Chúng rất thông minh, một ngày nào đó chúng sẽ chiếm lấy Trái đất. Nhưng bây giờ bạn phải quyết định cái nào bạn sẽ sử dụng, chẳng hạn như grep, egrephoặc fgrep.
Keith

1
Nhưng nếu bạn sử dụng egrep thường xuyên và sau đó đột nhiên chuyển sang fgrep, nó có thể quyết định giết bạn trong giấc ngủ vì không chung thủy.
Shadur

1
Họ thông minh như bàn tay nắm lấy chúng.
luis.espinal 15/03

Câu trả lời:


7

Unix chỉ là một tiêu chuẩn, nó chỉ định những gì việc triển khai nên làm, nhưng không phải là cách chúng nên làm.

Do đó, việc triển khai grep / sort / find rất có thể sẽ sử dụng các cách tiếp cận khác nhau trên các hệ thống khác nhau (và thậm chí một hệ thống, như Linux, có các triển khai đồng thời).

Đối với Linux, bạn luôn có thể xem mã nguồn.


2
Để hoàn thành câu trả lời của bạn: gnu.org/software/coreutils
sahid

Tại sao bạn cần xem mã nguồn? thuật toán greps là nổi tiếng và tài liệu. Nó thậm chí còn trong trang Wikipedia cho grep. liên kết
Đã xóa tài khoản

@ Đã xóa Tôi nghĩ rằng bạn đang nhầm lẫn các nguyên tắc với việc thực hiện.
Šimon Tóth

@Let_Me_Be: Thuật toán và thậm chí việc triển khai cũng được biết đến và được ghi lại. liên kết liên kết
Đã xóa tài khoản

@ Đã xóa Có thể tôi không hiểu những gì bạn đang cố nói, nhưng Linux grep từ coreutils đang sử dụng một thuật toán cụ thể, không có nghĩa là tất cả các triển khai đều sử dụng thuật toán này. Và vâng, bạn đúng trong các thuật toán có xu hướng được nhiều người biết đến (vì đó là điểm của việc thiết kế chúng).
Šimon Tóth


1

Tiêu chuẩn UNIX không chỉ định chi tiết triển khai cho các công cụ hệ thống tiêu chuẩn, trừ các trường hợp thực sự hiếm. Bạn có thể tìm thấy vesion Thông số kỹ thuật Unix đơn mới nhất tại đây (cảnh báo: yêu cầu đăng ký).

Với ý nghĩ đó, mọi UNIX (Hệ thống V và hậu duệ trực tiếp như BSD, Solaris, Mac OS X, v.v.) hoặc Hệ điều hành dựa trên UNIX (hậu duệ hoặc tương tự: Linux, Minix) đều có các triển khai riêng về các tiện ích được mô tả trong đặc tả UNIX. Ví dụ. hãy xem FreeBSDLinux / GNU Coreutils . Coi chừng rằng một số công cụ tách riêng toàn bộ dự án như GNU diff hoặc GNU grep . Ngoài ra, một thực tế khác là một số triển khai của các công cụ này có thể tìm đường đến các hệ thống UNIX khác như tiêu chuẩn, sau đó là các công cụ ban đầu được viết cho, ví dụ như một số lõi gnu trong freebsd hoặc GCC.

Phần thưởng: Để quấn đầu quanh cây gia đình UNIX, hãy xem biểu đồ này .


0

Tôi muốn biết những thuật toán nào họ sử dụng trong nội bộ và làm thế nào để thông minh quyết định một thuật toán cụ thể cho một nhiệm vụ cụ thể? Ví dụ: nếu sort có được một tệp đầu vào lớn, nó sẽ sử dụng các thuật toán khác nhau cho các kích thước dữ liệu khác nhau?

Đó là một câu hỏi thú vị (+1 cho điều đó). Tôi không biết câu trả lời là gì, nhưng nếu tôi là bạn, tôi sẽ xem mã nguồn của các tiện ích GNU điển hình để có ý tưởng về thuật toán của chúng.

Liệu grep có chuyển đổi thuật toán một cách thông minh trong khi tìm kiếm các tập dữ liệu khác nhau không?

Tôi không nghĩ vậy. Đừng trích dẫn tôi vì tôi thực sự không thể nói với bạn một cách chắc chắn 100%, nhưng tôi thực sự không nghĩ vậy. Triết lý của UNIX về mọi thứ là một thứ chỉ làm một thứ và một thứ duy nhất. Đó là lý do tại sao chúng tôi có một số phiên bản của grep ( grep, egrep, fgrep).

Ngoài ra, ý tưởng là làm một việc và chỉ một việc duy nhất vào thời gian chạy. Các hành vi và thuật toán khác nhau có thể được cấu hình làm đối số dòng lệnh, để cùng một chương trình có thể hoạt động hơi khác nhau (và có thể được tối ưu hóa hơn một chút) giữa các lần chạy. Ví dụ tốt là wcdifflệnh.

Tuy nhiên, việc điều chỉnh hành vi là dựa trên cấu hình (thông qua các đối số dòng cmd); họ không thay đổi / điều chỉnh hành vi trong thời gian chạy. Nó thường là một sự phức tạp không cần thiết đối với loại tạo tác mà các công cụ UNIX nhắm đến.

Độ phức tạp như vậy phù hợp hơn với các công cụ IMO phức tạp hơn, ít mục đích chung hơn.


2
Chủ đề ở đây là nhiều hơn Không, họ thực sự ngu ngốc! . Bạn phải nói với họ chính xác những gì phải làm. Dù sao, chúng tôi không muốn họ quá thông minh với chúng tôi mà bạn biết.
tshepang

0

Liệu grep có chuyển đổi thuật toán một cách thông minh trong khi tìm kiếm các tập dữ liệu khác nhau không?

Tôi không nghĩ vậy, nhưng nó chuyển sang thuật toán phi RE "nhanh" khi được gắn cờ -f (hoặc được gọi là fgrep).


tức là không thực sự thông minh :)
tshepang 17/03/2016
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.