Jak utrzymać system plików Dotfiles niezależnie od systemu?

21

Z powodu pracy ostatnio zacząłem używać systemu OS X i skonfigurowałem go za pomocą homebrew, aby uzyskać podobne wrażenia jak w przypadku Linuksa.

Istnieje jednak kilka różnic w ich ustawieniach. Niektóre muszą znajdować się na jednym systemie. Ponieważ moje pliki dot żyją w repozytorium git, zastanawiałem się, jaki przełącznik mogę ustawić, aby niektóre konfiguracje były odczytywane tylko dla systemu Linux, a inne dla OS X.

Jeśli chodzi o pliki dotfile, to mam na myśli między innymi .bash_profileslub .bash_alias.

k0pernikus
źródło
Zrobiłem to z gałęziami git. Mam jeden dla FreeBSD, Gentoo i Ubuntu. Ale to nie jest idealne.
Raphael Ahrens,
@RaphaelAhrens Chcę uniknąć takiego rozwiązania branżowego, ponieważ jest podatne na rozbieżności.
k0pernikus 17.07.13
Tak, możesz to trochę ułatwić, umieszczając rzeczy specyficzne dla systemu w specjalnych plikach. Ale jak powiedziałem, nie jest idealny.
Raphael Ahrens,
stackoverflow.com/questions/394230/... Możesz sprawdzić Darwina w systemie OS X.
Raphael Ahrens,
Moje podejście w zasadzie sprowadza się do if (exists rcfile.local); source rcfile.local; endif, przetłumaczone na odpowiedni plik rc. Główny plik rc staram się utrzymać agnostyczny system, podczas gdy .localwersja ma ustawienia specyficzne dla systemu. Jeśli chcesz mieć to wszystko w jednym repozytorium, możesz mieć katalogi systemowe i dowiązać plik rcfile.local do pliku w odpowiednim katalogu.
jw013,

Odpowiedzi:

22

Zachowaj możliwie największą przenośność plików dot i unikaj ustawień zależnych od systemu operacyjnego lub przełączników, które wymagają określonej wersji narzędzia, np. Unikaj składni GNU, jeśli nie używasz oprogramowania GNU we wszystkich systemach.

Prawdopodobnie natkniesz się na sytuacje, w których pożądane jest użycie ustawień specyficznych dla systemu. W takim przypadku użyj instrukcji switch z indywidualnymi ustawieniami:

case $(uname) in
  'Linux')   LS_OPTIONS='--color=auto --group-directories-first' ;;
  'FreeBSD') LS_OPTIONS='-Gh -D "%F %H:%M"' ;;
  'Darwin')  LS_OPTIONS='-h' ;;
esac

W przypadku, gdy pliki konfiguracyjne dowolnych aplikacji wymagają różnych opcji, możesz sprawdzić, czy aplikacja udostępnia przełączniki zgodności lub inne mechanizmy. Na vimprzykład możesz sprawdzić wersję i poziom poprawek w celu obsługi funkcji starszych wersji lub wersji skompilowanych z innym zestawem funkcji, których nie masz. Przykładowy fragment z .vimrc:

if v:version >= 703
  if has("patch769")
    set matchpairs+=“:”
  endif
endif
Marco
źródło
uname -sjest jak uname. uname oznacza nazwę Unix.
Stéphane Chazelas,
1
@StephaneChazelas Tak się składa, że ​​jest gwarantowane w różnych systemach i zawsze mogę upuścić -s?
Marco
1
tak, unamesam był kanonicznym sposobem robienia tego od dziesięcioleci i jest określony przez POSIX. Oryginał uname(w PWB Unix) nie miał żadnej opcji.
Stéphane Chazelas,
@StephaneChazelas Dziękuję za wyjaśnienie, usunąłem -stę odpowiedź i będę o tym pamiętać w przyszłych skryptach.
Marco
Jest to względnie drobny szczegół i nie umniejsza znaczenia zilustrowanego przez twój przykład, ale czy te cytaty w vimrc setnaprawdę powinny być U + 201C i U + 201D, a nie U + 0022?
CVn
3

Jeśli martwisz się tylko o pliki, które są faktycznie wykonywane, takie jak .bash_profiles i znajomi, możesz być w stanie uniknąć np. unameRóżnicowania w zależności od systemu, na którym działa kod.

Na przykład całkowicie niesprawdzony i z zastrzeżeniem, że nie mam OS X do wypróbowania, jeśli obecnie masz Linux:

alias ll='ls -lFA'

oraz w systemie Mac OS X:

alias ll='ls -lFAx'

(gdzie -xzmusza OS X do lsrobienia czegoś, co domyślnie robi GNU ls), to można je połączyć w coś takiego:

OS="$(uname -s)"
if test "$OS" = "Darwin"; then
    alias ll='ls -lFAx'
    # ...other OS X-specific things go here...
else if test "$OS" = "Linux"; then
    alias ll='ls -lFA'
    # ...other Linux-specific things go here...
fi
# ...generic things go here...

Jedynym wymaganiem jest więc, aby uname -sdziałał w większości w ten sam sposób (powinien, ponieważ oba systemy są w rozsądnym zakresie POSIX-y i uname -s jest wymagany przez POSIX (dziękuję Marco za zwrócenie na to uwagi )) oraz, że składnia do rozgałęziania skryptu powłoki oparte na porównaniu ciągów jest takie samo. Prawdopodobnie możesz również przeprowadzić test w oparciu o inne kryteria; np. możesz poszukać / etc / lsb_release, sprawdzić, czy / proc / sys / kernel / ostype zawiera „Linux”, lub jakiekolwiek inne testy, jakie możesz wymyślić.

CVn
źródło
@RaphaelAhrens DarwinWłaśnie sprawdziłem.
k0pernikus 17.07.13
@RaphaelAhrens Jak napisałem, nie mam OS X do wypróbowania różnych rzeczy, więc postanowiłem pokazać pomysł, zamiast spędzać dużo czasu na jednym stosunkowo nieznaczącym szczególe, którego OP może w prosty sposób dowiedzieć się.
CVn
Wikipedia na ratunek en.wikipedia.org/wiki/Uname, jeśli ktoś inny chce tam bash dla Windows lub innych rzeczy.
Raphael Ahrens,
1
-oPrzełącznik uname nie jest POSIX i nie działa w wielu systemach, np. Solaris. -sjest obowiązkowy w POSIX i najbardziej zgodny sposób. IEEE Std 1003.1
Marco
2
OSTYPEnie jest dostępny w powłoce POSIX. Nie powiedzie się na przykład podczas domyślnej instalacji FreeBSD i można go używać tylko w .bashrclub .zshrc. Nie działa niezawodnie w .profile, .aliasitp. Ponieważ mówimy tutaj o kompatybilności, radzę iść bezpieczną drogą, zamiast polegać na konkretnych funkcjach powłoki, które nie są gwarantowane w każdym systemie.
Marco