Beberapa alasan OP menyatakan opsi tidak cocok tidak memiliki dasar dalam kenyataan. Di sini, saya menunjukkan efek seperti apa yang menggunakan strategi OP 4:
Pada sebagian besar distribusi, grep
diinstal dalam /bin
(khas) atau /usr/bin
(OpenSUSE, mungkin yang lain), dan default PATH
berisi /usr/local/bin
sebelum /bin
atau /usr/bin
. Ini berarti bahwa jika Anda buat /usr/local/bin/grep
dengan
#!/bin/sh
exec /bin/grep --color=auto "$@"
di mana /bin/sh
shell yang kompatibel dengan POSIX disediakan oleh distribusi Anda, biasanya bash atau dash. Jika grep
ada /usr/bin
, maka buatlah itu
#!/bin/sh
exec /usr/bin/grep --color=auto "$@"
Overhead skrip ini minimal. The exec
pernyataan berarti bahwa penafsir naskah digantikan oleh grep
biner; ini berarti bahwa shell tidak tetap dalam memori saat grep
sedang dieksekusi. Dengan demikian, satu-satunya overhead adalah satu eksekusi tambahan dari penerjemah skrip, yaitu latensi kecil dalam waktu jam dinding. Latensi kira-kira konstan (bervariasi hanya tergantung pada apakah grep
dan sh
sudah dalam cache halaman atau tidak, dan pada seberapa banyak bandwidth I / O tersedia), dan tidak tergantung pada berapa lama grep
dieksekusi atau berapa banyak data yang diproses.
Jadi, berapa lama latensi itu, yaitu overhead ditambahkan oleh skrip wrapper?
Untuk mengetahuinya, buat skrip di atas, dan jalankan
time /bin/grep --version
time /usr/local/bin/grep --version
Di mesin saya, yang pertama membutuhkan waktu nyata 0,005 (melintasi sejumlah besar berjalan), sedangkan yang terakhir membutuhkan waktu nyata 0,006. Jadi, overhead menggunakan pembungkus pada mesin saya adalah 0,001 (atau kurang) per doa.
Ini tidak signifikan.
Saya juga gagal melihat sesuatu yang "kotor" tentang ini, karena banyak aplikasi dan utilitas umum menggunakan pendekatan yang sama. Untuk melihat daftar seperti itu di mesin Anda di /bin
dan /usr/bin
, jalankan saja
file /bin/* /usr/bin/* | sed -ne 's/:.*shell script.*$//p'
Pada komputer saya, output di atas termasuk egrep
, fgrep
, zgrep
, which
, 7z
, chromium-browser
, ldd
, dan xfig
, yang saya gunakan cukup sering. Kecuali jika Anda menganggap seluruh distribusi Anda "kotor" karena mengandalkan skrip wrapper, Anda tidak punya alasan untuk menganggap skrip wrapper seperti itu "kotor".
Mengenai masalah skrip pembungkus seperti itu dapat menyebabkan:
Jika hanya pengguna manusia (yang bertentangan dengan skrip) yang menggunakan versi grep yang secara default untuk mendukung warna jika output ke terminal, maka skrip wrapper dapat dinamai colorgrep
atau cgrep
atau apa pun yang sesuai dengan OP.
Ini menghindari semua kemungkinan masalah kompatibilitas, karena perilaku grep
tidak berubah sama sekali.
Mengaktifkan grep
opsi dengan skrip wrapper, tetapi dengan cara yang menghindari masalah baru:
Kami dapat dengan mudah menulis ulang skrip pembungkus untuk mendukung kebiasaan GREP_OPTS
meskipun GREP_OPTIONS
tidak didukung (karena sudah usang). Dengan cara ini pengguna cukup menambahkan export "GREP_OPTIONS=--color=auto"
atau mirip dengan profil mereka. /usr/local/bin/grep
kemudian
#!/bin/sh
exec /bin/grep $GREP_OPTIONS "$@"
Perhatikan bahwa tidak ada tanda kutip di sekitar $GREP_OPTIONS
, sehingga pengguna dapat menentukan lebih dari satu opsi.
Di sistem saya, mengeksekusi time /usr/local/bin/grep --version
dengan GREP_OPTIONS
kosong, atau dengan GREP_OPTIONS=--color=auto
, sama cepatnya dengan versi sebelumnya dari skrip wrapper; yaitu, biasanya membutuhkan satu milidetik lebih lama untuk dieksekusi daripada polos grep
.
Versi terakhir ini adalah yang saya pribadi sarankan untuk digunakan.
Singkatnya, strategi OP 4:
direkomendasikan oleh grep
pengembang
sepele untuk diterapkan (dua baris)
memiliki overhead yang tidak signifikan (latensi ekstra satu milidetik per doa pada laptop khusus ini; mudah diverifikasi pada setiap mesin)
dapat diimplementasikan sebagai skrip wrapper yang menambahkan GREP_OPTS
dukungan (untuk menggantikan yang sudah usang / tidak didukung GREP_OPTIONS
)
dapat diimplementasikan (sebagai colorgrep
/ cgrep
) yang tidak mempengaruhi skrip atau pengguna yang ada sama sekali
Karena ini adalah teknik yang sudah banyak digunakan dalam distribusi Linux, itu adalah teknik yang umum dan tidak "kotor".
Jika diimplementasikan sebagai pembungkus terpisah ( colorgrep
/ cgrep
), itu tidak dapat membuat masalah baru karena tidak mempengaruhi grep
perilaku sama sekali. Jika diimplementasikan sebagai skrip wrapper yang menambahkan GREP_OPTS
dukungan, menggunakan GREP_OPTS=--color=auto
memiliki risiko yang sama persis (wrt. Masalah dengan skrip yang ada) yang --color=auto
akan ditambahkan default upstream . Dengan demikian, komentar bahwa ini "menciptakan lebih banyak masalah daripada yang dipecahkan" sama sekali tidak benar: tidak ada masalah tambahan yang dibuat.