Kabuk yapılandırma komut dosyalarında, BSD'deki coreutils arasındaki GNU'ya kıyasla farklılıkları nasıl açıklayabilirim?


9

Bu aya kadar, kabuk yapılandırmalarım oldukça basitti (sadece bir .bashrcveya .bash_profileesas olarak bazı takma adlarla), ancak yeniden düzenleme yaptım, böylece zsh ve bash kullanmamıza bağlı olarak farklı davranışlar elde edebilirim. Önce ne olursa olsun çalışması gereken bir genel kabuk yapılandırma dosyası kaynağı, daha sonra kullanılan belirli kabuk için uzmanlaşmak (buna symlink).

Bugün çalışmayı lsbıraktığımda şaşırdım . Yeniden düzenleme sırasında .bashrcbir takma ad olduğu ortaya çıktı

alias ls='ls --color=always'

lsOSX'teki Terminal'de bash için bir şeyler kırıyordu. BSD'nin rengi lssevdiğini -G, ancak GNU'nun (veya Ubuntu'da ne varsa) sevdiğini gördükten sonra --color, birkaç seçeneğin farklı olduğu açıktı.

Sorum şu: BSD ve GNU coreutils arasındaki seçeneklerdeki farklılıkları hesaba katmanın en iyi yolu nedir? ifHangi işletim sisteminin kullanıldığını görmek ve doğru davranışı uygulamak için bloklarda env değişkenini test etmeli miyim ? Yoksa her işletim sistemi için ayrı yapılandırma dosyaları oluşturmak daha mantıklı mı?

Bu soruların cevapları öznel olsa da, BSD ve GNU coreutils arasındaki farklılıkların kapsamının bir özeti gibi görünmektedir ve çoğu * nix'te kullanılabilir bir genel yapılandırmayı yapmak için bunların etrafındaki stratejiler oldukça objektif olacaktır.


Mermileri değiştirmek hiçbir şeyi düzeltmez ve ls -cbundan farklıdır ls --color. Sorunu düzeltmek için düzenledi.
Mikel

Yanıtlar:


9

Farklı işletim sistemlerini destekleyen komut dosyaları yazmanın tek güvenilir yolu, yalnızca POSIX tarafından tanımlanan özellikleri kullanmaktır.

Kişisel kabuk yapılandırmalarınız gibi şeyler için, özel kullanım durumunuza uyan kesmek kullanabilirsiniz. Aşağıdaki gibi bir şey çirkin, ama hedefi başaracak.

if ls --version 2>/dev/null | grep -q 'coreutils'; then
    alias ls='ls --color=always'
else
    alias ls='ls -G'
fi

Farklı yöntemlerle oynuyorum ve bence "çirkin" çözümünüz oldukça iyi ve o kadar da çirkin değil. Anlaşıldığı üzere, daha önce ls için seçeneklerdeki uyumsuzluğu fark etmemiştim çünkü Ports'dan GNU coreutils kullanıyordum. Bu, $ OSTYPE üzerinde 'if' yapmanın istenen sonuçları verememesinin bir örneğidir.
Labirent

GNU coreutils olmadığında "hala ls --version" dan kaynaklanan hatayı bastırmanın bir yolu var mıdır (ancak yine de coreutils'i test edebilir)?
labirent

Hatayı bastırma konusunda boşver. Ben sadece grep borulama önce stderr / dev / null yönlendirir ve ben istediğim gibi çalışır.
labirent

3
coreutilsAçıkça aramak yerine , neden sadece renk bayrağının çalışıp çalışmadığını test etmiyoruz, ör if ls --color=auto -d / >/dev/null 2>&1; then ....
Mikel

mikel sadece renk konusunda endişeliyseniz (örnekte olduğu gibi), sorun değil. Diğer özellikleri de önemsiyorsanız, coreutils'i kontrol etmek yararlıdır.
jordanm

3

İle kod çöp iftürüne bir geçişi sağlamak üzere tablolar coreutils ancak farklı türde işlemek için temiz bir programlama çözüm kullanımı etmek, çalışır polimorfizmi . Bu Bash olduğundan, kendimiz için polimorfizmimiz yok, ama sahte bir yolla uğraşıyorum. Tek gereksinim, .bashrcdosyanızın vb. İşlevler halinde düzenlenmiş olmasıdır.

İlk olarak coreutils platform türü için bir test oluşturuyorum :

get_coreutils_platform() {
    local ls_version="$(ls --version 2>/dev/null)"
    if [[ "$ls_version" == *"GNU coreutils"* ]]; then
        echo gnu
    else
        echo bsd
    fi
}

Sonra türüne göre gönderebiliriz:

platform=$(get_coreutils_platform)
define_standard_aliases_$platform
configure_shell_vars_$platform

İşte BSD uygulaması:

define_standard_aliases_bsd() {
    define_standard_aliases
}

configure_shell_vars_bsd() {
    configure_shell_vars
    export CLICOLOR=1
}

( CLICOLORDeğişkeni alias, daha küçük bir temizleyici gibi görünen bir kullanmak yerine renkleri açmak için kullandığımızı unutmayın )

Ve GNU imhası:

define_standard_aliases_gnu() {
    define_standard_aliases
    alias ls='ls --color=auto'
}

configure_shell_vars_gnu() {
    configure_shell_vars
}

Tamlık uğruna, "soyut temel" in örnek bir uygulaması:

define_standard_aliases() {
    alias ll='ls -l'
    alias l.='ls -d .*'
}

configure_shell_vars() {
    export EDITOR=vim
}

Örneğin GNU l'leri olan ancak GNU cat yüklü olmayan sistemlerin% 0,1'inde olmadığınız sürece bu çok daha temizdir (belki de eski ve fileutils var ancak textutils yok). Özellikle takma adlarınızın hiçbiri içermediğinden, lsdağıtım programınızda kullanmak cazip olurdu . catcat
Mikel

Ayrıca, --color=autoilk takma ad bu seçeneği eklediğinden, ikinci ve üçüncü takma adlarınıza ihtiyacınız olmamalıdır ls.
Mikel

1
@Mikel whoa, aliasbunun yinelemeli olduğunu tamamen anlamadım . Bu, örneği daha basit hale getirmeme izin veriyor.
Michael Kropat

Çok daha iyi. :-)
Mikel

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.