Một số lý do OP đã tuyên bố các tùy chọn không phù hợp không có cơ sở trong thực tế. Ở đây, tôi chỉ ra loại hiệu ứng sử dụng chiến lược 4 của OP có:
Trên hầu hết các bản phân phối, grepđược cài đặt trong /bin(điển hình) hoặc /usr/bin(OpenSUSE, có thể là các bản phân phối khác) và mặc định PATHchứa /usr/local/bintrước /binhoặc /usr/bin. Điều này có nghĩa là nếu bạn tạo /usr/local/bin/grepbằng
#!/bin/sh
exec /bin/grep --color=auto "$@"
nơi /bin/shcó vỏ tương thích POSIX do phân phối của bạn cung cấp, thường là bash hoặc dash. Nếu greplà trong /usr/bin, sau đó làm cho
#!/bin/sh
exec /usr/bin/grep --color=auto "$@"
Chi phí hoạt động của kịch bản này là tối thiểu. Câu execlệnh có nghĩa là trình thông dịch kịch bản được thay thế bằng greptệp nhị phân; điều này có nghĩa là shell không còn trong bộ nhớ trong khi grepđang được thực thi. Do đó, chi phí duy nhất là một lần thực hiện thêm của trình thông dịch kịch bản, tức là độ trễ nhỏ trong thời gian đồng hồ treo tường. Độ trễ gần như không đổi (chỉ thay đổi tùy thuộc vào việc có grepvà shđã có trong bộ đệm trang hay không và tùy thuộc vào mức độ băng thông I / O có sẵn) và không phụ thuộc vào thời gian grepthực thi hoặc lượng dữ liệu mà nó xử lý.
Vì vậy, độ trễ đó là bao lâu, tức là chi phí được thêm bởi tập lệnh bao bọc?
Để tìm hiểu, tạo tập lệnh trên và chạy
time /bin/grep --version
time /usr/local/bin/grep --version
Trên máy của tôi, cái trước mất 0,005 giây thời gian thực (qua một số lượng lớn các lần chạy), trong khi cái sau mất 0,006 giây thời gian thực. Do đó, chi phí sử dụng trình bao bọc trên máy của tôi là 0,001s (hoặc ít hơn) cho mỗi lần gọi.
Điều này là không đáng kể.
Tôi cũng không thấy bất cứ điều gì "bẩn" về điều này, bởi vì nhiều ứng dụng và tiện ích phổ biến sử dụng cùng một cách tiếp cận. Để xem danh sách như vậy trên máy của bạn /binvà /usr/binchỉ cần chạy
file /bin/* /usr/bin/* | sed -ne 's/:.*shell script.*$//p'
Trên máy tính của tôi, kết quả trên đã bao gồm egrep, fgrep, zgrep, which, 7z, chromium-browser, ldd, và xfig, mà tôi sử dụng khá thường xuyên. Trừ khi bạn coi toàn bộ phân phối của mình là "bẩn" vì dựa vào các tập lệnh của trình bao bọc, bạn không có lý do gì để xem các tập lệnh trình bao bọc đó là "bẩn".
Đối với các vấn đề như vậy, một kịch bản trình bao bọc có thể gây ra:
Nếu chỉ sử dụng con người (như trái ngược với các kịch bản) đang sử dụng các phiên bản của grep rằng giá trị mặc định để hỗ trợ màu nếu đầu ra là một thiết bị đầu cuối, sau đó kịch bản wrapper thể được đặt tên colorgrephoặc cgrephoặc bất cứ điều gì OP thấy phù hợp.
Điều này tránh tất cả các vấn đề tương thích có thể, bởi vì hành vi của grepkhông thay đổi chút nào.
Kích hoạt greptùy chọn với tập lệnh bao bọc, nhưng theo cách tránh mọi vấn đề mới:
Chúng tôi có thể dễ dàng viết lại tập lệnh trình bao bọc để hỗ trợ một tùy chỉnh GREP_OPTSngay cả khi GREP_OPTIONSkhông được hỗ trợ (vì nó đã bị phản đối). Bằng cách này, người dùng có thể chỉ cần thêm export "GREP_OPTIONS=--color=auto"hoặc tương tự với hồ sơ của họ. /usr/local/bin/grepsau đó
#!/bin/sh
exec /bin/grep $GREP_OPTIONS "$@"
Lưu ý rằng không có dấu ngoặc kép xung quanh $GREP_OPTIONS, để người dùng có thể chỉ định nhiều hơn một tùy chọn.
Trên hệ thống của tôi, việc thực thi time /usr/local/bin/grep --versionvới GREP_OPTIONSrỗng, hoặc với GREP_OPTIONS=--color=auto, cũng nhanh như phiên bản trước của tập lệnh bao bọc; tức là, thường mất một mili giây để thực thi hơn đơn giản grep.
Phiên bản cuối cùng này là phiên bản mà cá nhân tôi khuyên bạn nên sử dụng.
Tóm lại, chiến lược 4 của OP:
được khuyến khích bởi các grepnhà phát triển
là tầm thường để thực hiện (hai dòng)
có chi phí không đáng kể (độ trễ thêm một phần nghìn giây cho mỗi lần gọi trên máy tính xách tay cụ thể này; dễ dàng xác minh trên mỗi máy)
có thể được triển khai như một tập lệnh bao bọc có thêm GREP_OPTShỗ trợ (để thay thế không dùng nữa / không được hỗ trợ GREP_OPTIONS)
có thể được triển khai (như colorgrep/ cgrep) hoàn toàn không ảnh hưởng đến tập lệnh hoặc người dùng hiện tại
Bởi vì nó là một kỹ thuật đã được sử dụng rộng rãi trong các bản phân phối Linux, nên đây là một kỹ thuật phổ biến và không "bẩn".
Nếu được triển khai như một trình bao bọc riêng ( colorgrep/ cgrep), nó không thể tạo ra vấn đề mới vì nó hoàn toàn không ảnh hưởng đến grephành vi. Nếu được triển khai như một tập lệnh bao bọc có thêm GREP_OPTShỗ trợ, việc sử dụng GREP_OPTS=--color=autocó chính xác các rủi ro tương tự (các vấn đề với các tập lệnh hiện tại) mà ngược dòng thêm mặc định --color=autosẽ. Do đó, nhận xét rằng điều này "tạo ra nhiều vấn đề hơn nó giải quyết" là hoàn toàn không chính xác: không có vấn đề bổ sung nào được tạo ra.