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 PATH
chứa /usr/local/bin
trước /bin
hoặc /usr/bin
. Điều này có nghĩa là nếu bạn tạo /usr/local/bin/grep
bằng
#!/bin/sh
exec /bin/grep --color=auto "$@"
nơi /bin/sh
có 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 grep
là 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 exec
lệnh có nghĩa là trình thông dịch kịch bản được thay thế bằng grep
tệ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ó grep
và 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 grep
thự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 /bin
và /usr/bin
chỉ 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 colorgrep
hoặc cgrep
hoặ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 grep
không thay đổi chút nào.
Kích hoạt grep
tù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_OPTS
ngay cả khi GREP_OPTIONS
khô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/grep
sau đó
#!/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 --version
với GREP_OPTIONS
rỗ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 grep
nhà 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_OPTS
hỗ 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 grep
hành vi. Nếu được triển khai như một tập lệnh bao bọc có thêm GREP_OPTS
hỗ trợ, việc sử dụng GREP_OPTS=--color=auto
có 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=auto
sẽ. 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.