Renkli grep çıktısı: GREP_OPTIONS değil takma ad değil


10

Renkli çıktı istiyorum grep.

.... Fakat

  • Strateji 1: GREP_OPTIONS. Ancak bu onaylanmadı. Bkz. Http://www.gnu.org/software/grep/manual/html_node/Environment-Variables.html
  • Stragegy 2: GREP_COLORS ilk bakışta bir çözüm gibi görünüyor, ancak bu farklı bir şey yapıyor.
  • Strateji 3: Takma ad. find ... | xargs grepXargs diğer adları değerlendirmediği için bu işe yaramaz .
  • Strateji 4: Basit bir sarmalayıcı komut dosyası yazın. Hayır, bence bu çok kirli ve çözdüğünden daha fazla sorun çıkarıyor.
  • Strateji 5: Kaynak Kodunu Düzelt
  • Strateji 6: Grep geliştiricilerine başvurun, GREP_OPTIONS'ın değiştirilmesini isteyin
  • Strateji GÜZEL ve KOLAY: ... bu eksik. Hiçbir fikrim yok.

Bunu nasıl çözebilirim?

Yardım etmeye çalıştığın için teşekkürler!

... ama ödül veremem

Bana kaba, küstah, aşağılayıcı, küfürlü de ...

Sadece çözüm buluyorum - çözüm yok. Bu soruya cevap gelmedi.

Çabalarınız için teşekkürler.


1
Bir sarmalayıcı betiği (Strateji 4'ünüz) "gerçekten bir cevap değil" olarak kullanmak için iki öneriyi reddettiniz. Bununla ilgili "kirli", "zahmetli" veya "gerçekten bir cevap değil" ifadesini açıklayabilir misiniz? Belki de çözülebilecek ayrı bir sorun.
JigglyNaga

2
strateji 5 kaynak kodu ve set yama olduğunu color_optioniçin2 ...
don_crissti

2
@JigglyNaga, bir paket betiğinin neden bir çözüm olmadığını açıklayacağım. Ekibimiz birkaç sunucuyu yönetir. Şu anda binden az, ama sayı artıyor. Evet, yapılandırma yönetimini kullanıyoruz ve hepsine bir komut dosyası dağıtmak kolay olurdu. Ama işlerin kolay ve anlaşılır olmasını istiyorum (takımdaki yeni üyeleri düşünün. Onları karıştırmak istemiyorum). --colorSeçenek zaten bir değeri vardır auto. Neden varsayılan olarak etkinleştiremediğini bilmiyorum.
guettli

Strateji 4 veya 5'i kullanmalısınız - exec grep --color=auto "$@"isteğe bağlı olarak farklı bir adla ( grepcveya colorgrep) , minimum tire / sh komut dosyası ( ) ile strateji 4'ü tercih ederim . Bunun ihmal edilebilir yükü vardır (ve çalışma zamanında ekstra eşzamanlı süreç yoktur). Onları "yeterince kolay değil" olarak etiketlemenizin nedeni , bu özelliği, uygulamak için (nispeten az) bir kerelik çaba harcamak için yeterince yararlı görmemeniz ve sizin için başka birisini aramanızdır. Bu nedenle , yayınlanan cevaplara "gerçekten bir cevap değil" yorumlarınız oldukça kaba.
Nominal Hayvan

1
@NominalAnimal Evet, haklısın "gerçekten bir cevap değil" kulağa kaba geliyor. Ben anadili yok. Hangi ifadeler (aynı mesajı aktarma) daha iyi olur?
guettli

Yanıtlar:


13

OP'nin seçeneklerin uygun olmadığını belirtmesinin nedenlerinden bazıları gerçekte hiçbir dayanağa sahip değildir. Burada OP'nin 4. stratejisini kullanarak ne tür etkilerin olduğunu gösteriyorum:


Çoğu dağıtımda, (tipik) veya (OpenSUSE, belki diğerleri) grepiçine yüklenir ve varsayılan , önce veya öğesini içerir . Bu ,/bin/usr/binPATH/usr/local/bin/bin/usr/bin/usr/local/bin/grep

#!/bin/sh
exec /bin/grep --color=auto "$@"

/bin/shdağıtımınız tarafından sağlanan POSIX uyumlu bir kabuk nerede , genellikle bash veya tire. Eğer grepiçindedir /usr/bin, o zaman yapmak

#!/bin/sh
exec /usr/bin/grep --color=auto "$@"

Bu komut dosyasının yükü minimumdur. execKomut yorumlayıcı tarafından değiştirilir ifadesi araçlarının grepikili; yani kabuk grepyürütülürken bellekte kalmaz . Bu nedenle, tek yük, kod yorumlayıcısının fazladan yürütülmesi, yani duvar saati süresinde küçük bir gecikmedir. Gecikme kabaca sabittir (yalnızca sayfa önbelleğinde olup olmadığına grepve shne kadar G / Ç bant genişliğinin kullanılabilir olduğuna bağlı olarak değişir ) ve ne kadar süre grepçalıştığına veya ne kadar veri işlediğine bağlı değildir .

Peki, bu gecikme süresi ne kadardır, yani sarıcı komut dosyası tarafından ek yükü?

Bulmak için yukarıdaki komut dosyasını oluşturun ve çalıştırın

time /bin/grep --version
time /usr/local/bin/grep --version

Makinemde, birincisi 0.005s gerçek zaman alır (çok sayıda koşu boyunca), ikincisi 0.006s gerçek zaman alır. Bu nedenle, sarma makinesini makinemde kullanmanın yükü, her invokasyon için 0.001s (veya daha az) 'dir.

Bu önemsiz.

Bu konuda "kirli" bir şey göremiyorum, çünkü birçok yaygın uygulama ve yardımcı program aynı yaklaşımı kullanıyor. Daki makinede böyle listesini görmek için /binve /usr/binsadece koşmak,

file /bin/* /usr/bin/* | sed -ne 's/:.*shell script.*$//p'

Benim makinede yukarıdaki çıkış içerir egrep, fgrep, zgrep, which, 7z, chromium-browser, ldd, ve xfigben oldukça sık olarak kullanırız. Tüm dağıtımınızın sarmalayıcı komut dosyalarına güvenmek için "kirli" olduğunu düşünmüyorsanız, bu tür sarmalayıcı komut dosyalarını "kirli" olarak değerlendirmek için hiçbir nedeniniz yoktur.


Sorunlara gelince, böyle bir sarıcı komut dosyası neden olabilir:

Yalnızca komut dosyası yerine insan kullanıcılar, çıktı bir uçbirimde ise renk desteğini varsayılan olarak kullanan grep sürümünü kullanıyorsa, sarıcı komut dosyası adlandırılabilir colorgrepveya cgrepOP'nin uygun gördüğü her şey olabilir .

Bu, tüm uyumluluk sorunlarını önler, çünkü davranışları grephiç değişmez.


grepSeçenekleri bir sarıcı komut dosyasıyla, ancak yeni sorunları önleyecek şekilde etkinleştirme :

Desteklenmemiş GREP_OPTSolsa bile GREP_OPTIONS(zaten kullanımdan kaldırıldığı için) sarmalayıcı komut dosyasını özel olarak desteklemek için kolayca yeniden yazabiliriz . Bu şekilde kullanıcılar export "GREP_OPTIONS=--color=auto"profillerini kolayca ekleyebilir veya buna benzer. /usr/local/bin/grepo zaman

#!/bin/sh
exec /bin/grep $GREP_OPTIONS "$@"

$GREP_OPTIONSKullanıcıların birden fazla seçenek belirleyebilmeleri için etrafında tırnak olmadığına dikkat edin .

Benim sistemde, yürütme üzerinde time /usr/local/bin/grep --versionolan GREP_OPTIONSboş veya birlikte GREP_OPTIONS=--color=auto, sadece hızlı sarıcı komut dosyası önceki sürümüne kadar olduğu; yani, yürütülmesi normalde düzden bir milisaniye daha uzun sürer grep.

Bu son sürüm, şahsen kullanılmasını tavsiye ettiğim sürümdür.


Özetle, OP'nin strateji 4:

  • grepgeliştiriciler tarafından tavsiye ediliyor

  • uygulanması önemsizdir (iki satır)

  • önemsiz bir ek yüke sahiptir (bu dizüstü bilgisayarda her çağrı için bir milisaniye ekstra gecikme süresi; her makinede kolayca doğrulanabilir)

  • GREP_OPTSdestek ekleyen bir sarmalayıcı komut dosyası olarak uygulanabilir (kullanımdan kaldırılmış / desteklenmeyenlerin yerini almak için GREP_OPTIONS)

  • komut dosyalarını veya mevcut kullanıcıları hiç etkilemeyen ( colorgrep/ olarak cgrep) uygulanabilir

Zaten Linux dağıtımlarında yaygın olarak kullanılan bir teknik olduğundan, "kirli" değil, yaygın bir tekniktir.

Ayrı bir paket ( colorgrep/ cgrep) olarak uygulanırsa, grepdavranışı hiç etkilemediğinden yeni sorunlar oluşturamaz . GREP_OPTSDestek ekleyen bir sarıcı komut dosyası olarak uygulanırsa , kullanma GREP_OPTS=--color=autoişlemi, yukarı akış varsayılan eklemenin gerçekleştireceği risklerle (wrt. Varolan komut dosyalarındaki sorunlar) tamamen aynıdır --color=auto. Bu nedenle, bunun "çözdüğünden daha fazla sorun yarattığı" yorumu tamamen yanlıştır: ek sorun yaratılmaz.


3

İlk stratejiyle sağladığınız belgeler şunları söylüyor:

Lütfen bunun yerine bir takma ad veya komut dosyası kullanın. Örneğin, grep '/ usr / bin' dizinindeyse PATH'nize $ HOME / bin başının başına yazabilir ve aşağıdakileri içeren $ HOME / bin / grep yürütülebilir bir komut dosyası oluşturabilirsiniz:

#! /bin/sh
export PATH=/usr/bin
exec grep --color=auto --devices=skip "$@"

Dolayısıyla, takma ad sizin için imkansızsa, sarmalayıcı komut dosyası tek yoldur.


Bu Strateji 4 ... gerçekten bir cevap deđil.
guettli

3

GREP_OPTIONSDeğişkenin kullanımdan kaldırılmasının nedeni, grepbir komut dosyasında bir yerde çağrıldığında ve komut dosyası değişkenden gelen alternatif seçeneklerle çalışmadığında sorunlara neden olma eğilimindedir . İçin bir sarmalayıcı komut dosyası grepyazarsanız, farklı bir ad vermedikçe aynı soruna sahip olursunuz .

$ cat ~/bin/cgrep
#!/bin/sh
exec grep --color=always "$@"
$ find  -exec cgrep  {} +

Alternatif olarak, favori seçeneklerinizi bir değişkende saklayın. Zsh dışındaki kabuklarda, seçenekler joker karakterler ( \[*?) içeriyorsa bu zahmetlidir , ancak aksi takdirde bağımsız değişkenlerle bir komut almak için sıralanmamış değişkeni kullanabilirsiniz.

cgrep=(grep --color=always)
find  -exec $cgrep  {} +

GNU ve BSD grep'in bir dizin ağacını özyinelemeli olarak işleyebileceğini unutmayın, bu findda grepçoğu zaman birlikte kullanılması gerektiğini azaltır .


1
Bu Strateji 4 ... gerçekten bir cevap deđil.
guettli

@guettli, doğru cevap bu. Farklı bir davranışa sahip grepbir komut istiyorsanız, farklı bir ada sahip bir komut gerekir, aksi takdirde aynı adı korursanız, orijinal / standart davranışı bekleyen komut dosyalarını bozursunuz. Bu en temiz ve ek sorun yaratmaz .
Stéphane Chazelas

@ StéphaneChazelas evet haklısın. Bakış açınıza göre bu doğru cevaptır.
guettli

1

En kolay şey bir takma ad kullanmaktır (strateji 3). xargsKomutu gerçekten önemsiyorsanız , yine de bir bash işleviyle geçersiz kılabilirsiniz.

alias grep='grep --color'
xargs() {
    local args
    for ((i=1; i<=$#; i++))
    do
            if [[ "-E -L -P -I -s -d" == *"${!i}"* ]]; then
                    ((i=i+1))
            elif [[ ${!i:0:1} != "-" ]]; then
                    if [[ ${!i} == "grep" ]]; then
                            args="--color"
                    fi
                    /usr/bin/xargs ${@:1:i} $args ${@:i+1}
                    return;
            fi
    done
}

Ancak bu, grepekip tarafından önerilen çözüm gibi görünen bir sarmalayıcı komutu kullanmaktan daha iyi değildir :

/usr/local/bin/grep:

#!/bin/bash
/bin/grep --color "$@"

Benim düşünceme göre, bazı ortam değişkenlerine göre rengi etkinleştirecek değişkenin grepbasit bir değiştirmesini sağlamalarını istemek için geliştirici ekibiyle iletişime geçmelisiniz .GREP_OPTIONSgrep

colorSeçeneği varsayılan olarak veya GREP_COLORSayarlandığında etkinleştirmeleri oldukça basittir .


1
"... grep geliştirici ekibiyle iletişime geçmelisin ..." için teşekkür ederiz. Bu bana olumlu geribildirim veriyor. Şimdi biliyorum ki burada bir şeyin eksik olduğunu düşünen tek kişi ben değilim.
guettli

Soruya strateji6 olarak "... grep geliştirici ekibiyle iletişime geçmelisin ..." yorumunu ekledim. Şimdiye kadar bu benim en sevdiğim cevap.
guettli

0

Bu, @NominalAnimal'in en üstteki cevabından gelen çözümdür, ancak her zamanki grep: ...uyarılarda (yerine /bin/grep: ...):

#!/bin/bash
exec -a grep /bin/grep --color=auto "$@"

Nasıl paket yazacağımı biliyorum. Sarıcı bu bağlamda bir çözüm değildir.
guettli

@guettli Peki, cevap durumunuzu tam olarak ele almak anlamına gelmiyordu ... Yorumlar cevaplarla aynı biçimlendirme özelliklerine sahip olsaydı, bu bir yorum olurdu. (Orijinal yazar ya da başka bir şey tarafından tasarlanmadığı için benzer düzenlemeleri reddettim.) Durumunuza gelince, sorunuzun doğru bir cevabı olduğunu düşünüyorum: Başka bir "Strateji NICE-and-EASY" mevcut değil.
Kirill Bulygin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.