Do tego miesiąca moje konfiguracje powłoki były dość proste ( głównie a .bashrc
lub .bash_profile
niektóre aliasy), ale przerabiałem je tak, aby uzyskać inne zachowanie w zależności od tego, czy używam zsh i bash. Najpierw źródłowy plik konfiguracyjny powłoki, który powinien działać na cokolwiek, a następnie specjalizują się w konkretnej używanej powłoce (odsyłam do tego dowiązanie symboliczne).
Byłem dzisiaj zaskoczony, kiedy ls
przestałem pracować. Okazało się, że podczas refaktoryzacji .bashrc
istniał alias
alias ls='ls --color=always'
to było zepsute ls
w bash na terminalu w OSX. Kiedy zobaczyłem, że BSD ls
lubi -G
kolory, ale GNU (lub cokolwiek było na Ubuntu) --color
, było jasne, że całkiem sporo opcji się różni.
Moje pytanie brzmi: jaki jest najlepszy sposób na uwzględnienie różnic w opcjach i takich między rdzeniami BSD i GNU? Czy powinienem testować zmienną env w if
blokach, aby zobaczyć, jaki system operacyjny jest używany i zastosować prawidłowe zachowanie? Czy może bardziej sensowne jest tworzenie osobnych plików konfiguracyjnych dla każdego systemu operacyjnego?
Chociaż odpowiedzi na te pytania mogą być subiektywne, wydaje się, że podsumowanie zakresu różnic między rdzeniami BSD i GNU i strategie obejścia ich w celu umożliwienia używania ogólnej konfiguracji na większości * nix byłyby dość obiektywne.
ls -c
różni się odls --color
. Zredagowałem twoje pytanie, aby naprawićOdpowiedzi:
Jedynym niezawodnym sposobem pisania skryptów obsługujących różne systemy operacyjne jest używanie tylko funkcji zdefiniowanych przez POSIX.
W przypadku takich rzeczy, jak osobiste konfiguracje powłoki, możesz użyć hacków, które pasują do konkretnego przypadku użycia. Coś takiego jak poniżej jest brzydkie, ale osiągnie cel.
źródło
coreutils
wyraźnie, dlaczego nie po prostu przetestować, czy flaga koloru działa, npif ls --color=auto -d / >/dev/null 2>&1; then ...
.Zaśmiecanie kodu
if
instrukcjami, aby wykonać zmianę typu coreutils , działa, jednak czystym rozwiązaniem programistycznym do obsługi różnych typów jest użycie polimorfizmu . Ponieważ jest to Bash, nie mamy polimorfizmu per se, ale mam do czynienia z metodą, która może go sfałszować. Jedynym wymaganiem jest.bashrc
zorganizowanie pliku itp. W funkcje.Najpierw tworzę test dla typu platformy Coreutils :
Następnie możemy wysłać w zależności od typu:
Oto implementacja BSD :
(Uwaga: używamy tej
CLICOLOR
zmiennej do włączania kolorów zamiast użyciaalias
, który wydaje się mniejszy)I realizacja GNU :
Dla kompletności, oto przykładowa implementacja „abstrakcyjnej bazy”:
źródło
ls
raczejcat
, aby użyć go w twoim dyspozytorze , zwłaszcza, że żaden z twoich pseudonimów nie obejmujecat
.--color=auto
drugiego i trzeciego aliasu, ponieważ pierwszy alias dodaje tę opcjęls
.alias
to jest rekurencyjne. To pozwala mi uprościć przykład.Nie jest to bezpośrednia odpowiedź na twoje pytanie, ale mam skrypty otoki do obsługi takich rzeczy, a nie dodatkowych komplikacji w .bashrc Na przykład tutaj jest mój skrypt l, który obsługuje twoją sprawę tutaj na wiele platform:
http://www.pixelbeat.org/scripts/l
źródło