Saya ingin keluaran berwarna grep
.
.... Tapi
- Strategi 1: GREP_OPTIONS. Tapi ini sudah usang. Lihat http://www.gnu.org/software/grep/manual/html_node/Environment-Variables.html
- Stragegy 2: GREP_COLORS terlihat seperti solusi pada pandangan pertama, tetapi ini melakukan sesuatu yang berbeda.
- Strategi 3: alias. Ini tidak berfungsi
find ... | xargs grep
, karena xargs tidak mengevaluasi alias. - Strategi 4: Tulis skrip pembungkus sederhana. Tidak, saya pikir ini terlalu kotor dan membuat lebih banyak masalah daripada menyelesaikannya.
- Strategi 5: menambal kode sumber
- Strategi 6: Hubungi pengembang grep, minta penggantian GREP_OPTIONS
- Strategi NICE-and-EASY: ... ini tidak ada. Saya tidak tahu.
Bagaimana cara mengatasinya?
Terima kasih telah mencoba membantu!
... tapi aku tidak bisa memberikan hadiahnya
Sebut saya kasar, arogan, menghina, kasar ....
Saya hanya melihat jalan-jalan - tidak ada solusi. Tidak ada jawaban yang memuaskan pertanyaan itu.
Terima kasih untuk usaha Anda.
color_option
ke2
...--color
pilihan sudah memiliki nilaiauto
. Saya hanya tidak tahu mengapa Anda tidak dapat mengaktifkannya secara default.exec grep --color=auto "$@"
), secara opsional dengan nama yang berbeda (grepc
ataucolorgrep
). Ini memiliki overhead diabaikan (dan tidak ada proses bersamaan tambahan saat runtime). Alasan Anda menamai mereka "tidak cukup mudah" adalah kenyataan bahwa Anda tidak melihat fitur ini cukup berguna untuk menghabiskan upaya (relatif sedikit) satu kali untuk mengimplementasikannya, dan mencari orang lain untuk melakukannya untuk Anda. Karena itu, komentar "tidak benar-benar jawaban" Anda terhadap jawaban yang diposting cukup kasar.Jawaban:
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 defaultPATH
berisi/usr/local/bin
sebelum/bin
atau/usr/bin
. Ini berarti bahwa jika Anda buat/usr/local/bin/grep
dengandi mana
/bin/sh
shell yang kompatibel dengan POSIX disediakan oleh distribusi Anda, biasanya bash atau dash. Jikagrep
ada/usr/bin
, maka buatlah ituOverhead skrip ini minimal. The
exec
pernyataan berarti bahwa penafsir naskah digantikan olehgrep
biner; ini berarti bahwa shell tidak tetap dalam memori saatgrep
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 apakahgrep
dansh
sudah dalam cache halaman atau tidak, dan pada seberapa banyak bandwidth I / O tersedia), dan tidak tergantung pada berapa lamagrep
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
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 sajaPada komputer saya, output di atas termasuk
egrep
,fgrep
,zgrep
,which
,7z
,chromium-browser
,ldd
, danxfig
, 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
ataucgrep
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
meskipunGREP_OPTIONS
tidak didukung (karena sudah usang). Dengan cara ini pengguna cukup menambahkanexport "GREP_OPTIONS=--color=auto"
atau mirip dengan profil mereka./usr/local/bin/grep
kemudianPerhatikan 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
denganGREP_OPTIONS
kosong, atau denganGREP_OPTIONS=--color=auto
, sama cepatnya dengan versi sebelumnya dari skrip wrapper; yaitu, biasanya membutuhkan satu milidetik lebih lama untuk dieksekusi daripada polosgrep
.Versi terakhir ini adalah yang saya pribadi sarankan untuk digunakan.
Singkatnya, strategi OP 4:
direkomendasikan oleh
grep
pengembangsepele 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 didukungGREP_OPTIONS
)dapat diimplementasikan (sebagai
colorgrep
/cgrep
) yang tidak mempengaruhi skrip atau pengguna yang ada sama sekaliKarena 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 mempengaruhigrep
perilaku sama sekali. Jika diimplementasikan sebagai skrip wrapper yang menambahkanGREP_OPTS
dukungan, menggunakanGREP_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.sumber
Dokumentasi yang Anda berikan dengan strategi pertama mengatakan:
Jadi jika alias tidak mungkin bagi Anda, skrip wrapper adalah satu-satunya cara.
sumber
Alasan
GREP_OPTIONS
variabel itu ditinggalkan adalah bahwa ia cenderung menyebabkan masalah ketikagrep
dipanggil di suatu tempat dalam skrip dan skrip tidak bekerja dengan opsi alternatif yang berasal dari variabel. Jika Anda menulis skrip pembungkus untukgrep
maka Anda memiliki masalah yang sama, kecuali jika Anda memberikannya nama yang berbeda .Atau, simpan opsi favorit Anda dalam variabel. Dalam shell selain zsh, ini merepotkan jika opsinya berisi karakter wildcard (
\[*?
), tetapi sebaliknya Anda bisa menggunakan variabel yang tidak dikutip untuk mendapatkan perintah dengan argumen.Perhatikan bahwa GNU dan BSD grep dapat memproses pohon direktori secara rekursif, yang mengurangi kebutuhan
find
dalam kombinasi dengangrep
sebagian besar waktu.sumber
grep
, Anda memerlukan perintah dengan nama berbeda, atau jika Anda tetap menggunakan nama yang sama, Anda akan memecah skrip yang mengharapkan perilaku asli / standar. Itu yang terbersih dan tidak menimbulkan masalah tambahan .Cara termudah adalah menggunakan alias (strategi 3). Jika Anda benar-benar peduli dengan
xargs
perintah tersebut, Anda masih bisa menimpanya dengan fungsi bash.Tapi ini tidak lebih baik daripada menggunakan perintah wrapper yang tampaknya merupakan solusi yang disarankan oleh
grep
tim:Menurut pendapat saya, Anda harus menghubungi
grep
tim pengembang untuk meminta mereka memberikan pengganti sederhana untukGREP_OPTIONS
variabel yang akan memungkinkan warnagrep
sesuai dengan beberapa variabel lingkungan.Akan sangat sederhana bagi mereka untuk mengaktifkan secara default
color
opsi atau ketikaGREP_COLORS
telah ditetapkan.sumber
Ini adalah solusi dari jawaban teratas oleh @NominalAnimal tetapi dengan yang biasa
grep: ...
dalam peringatan (bukan/bin/grep: ...
):sumber