Wie kann ich dotfiles systemunabhängig halten?

21

Aufgrund meiner Arbeit habe ich kürzlich angefangen, OS X zu verwenden und habe es mit Homebrew eingerichtet, um eine ähnliche Erfahrung wie mit Linux zu erzielen.

Es gibt jedoch einige Unterschiede in ihren Einstellungen. Einige müssen nur auf einem System vorhanden sein. Da meine Punktedateien in einem Git-Repository gespeichert sind, habe ich mich gefragt, welche Art von Schalter ich einrichten könnte, sodass einige Konfigurationen nur für Linux-Systeme und andere für OS X gelesen werden.

Bezüglich Punktedateien beziehe ich mich unter anderem auf .bash_profilesoder .bash_alias.

k0pernikus
quelle
Ich habe das mit Git-Zweigen gemacht. Ich habe eine für FreeBSD, Gentoo und Ubuntu. Das ist aber nicht ideal.
Raphael Ahrens
@RaphaelAhrens Ich möchte eine solche branchenbasierte Lösung vermeiden, da sie zu Abweichungen neigt.
k0pernikus
Ja, Sie können es ein bisschen einfacher machen, wenn Sie das systemspezifische Material in spezielle Dateien packen. Aber wie gesagt nicht ideal.
Raphael Ahrens
stackoverflow.com/questions/394230/… Unter OS X können Sie nach Darwin suchen.
Raphael Ahrens
Mein Ansatz läuft im Grunde genommen darauf hinaus if (exists rcfile.local); source rcfile.local; endif, in die entsprechende rc-Datei übersetzt zu werden. Die Haupt-RC-Datei versuche ich systemunabhängig zu halten, während die .localVersion systemspezifische Einstellungen hat. Wenn Sie alles in einem einzigen Repository haben möchten, können Sie Systemverzeichnisse haben und die Datei rcfile.local mit der Datei im richtigen Verzeichnis verknüpfen.
JW013

Antworten:

22

Halten Sie die Punktedateien so portabel wie möglich und vermeiden Sie betriebssystemabhängige Einstellungen oder Schalter, die eine bestimmte Version eines Tools erfordern. Vermeiden Sie z. B. die GNU-Syntax, wenn Sie GNU-Software nicht auf allen Systemen verwenden.

Sie werden wahrscheinlich in Situationen geraten, in denen es wünschenswert ist, systemspezifische Einstellungen zu verwenden. In diesem Fall verwenden Sie eine switch-Anweisung mit den einzelnen Einstellungen:

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

Falls die Konfigurationsdateien beliebiger Anwendungen unterschiedliche Optionen erfordern, können Sie prüfen, ob die Anwendung Kompatibilitätsschalter oder andere Mechanismen bietet. Für vimzum Beispiel können Sie die Version überprüfen und Patchlevel zu Unterstützung bietet ältere Versionen oder Versionen mit einem anderen Feature - Set zusammengestellt, nicht hat. Beispiel-Snippet von .vimrc:

if v:version >= 703
  if has("patch769")
    set matchpairs+=“:”
  endif
endif
Marco
quelle
uname -sist wie uname. uname steht für unix name.
Stéphane Chazelas
1
@StephaneChazelas Ist es einfach so oder ist es systemübergreifend garantiert und ich kann das immer fallen lassen -s?
Marco
1
ja, unameallein ist seit Jahrzehnten der kanonische Weg und wird von POSIX vorgegeben. Das Original uname(in PWB Unix) hat keine Option gewählt.
Stéphane Chazelas
@StephaneChazelas Danke für die Klarstellung, ich habe -sdiese Antwort entfernt und ich werde sie für meine zukünftigen Skripte im Hinterkopf behalten.
Marco
Es ist ein relativ kleines Detail und lenkt nicht von dem Punkt ab, der in Ihrem Beispiel dargestellt wird. Aber sollten diese Anführungszeichen in der vimrc setwirklich U + 201C und U + 201D und nicht U + 0022 sein?
einen Lebenslauf vom
3

Wenn Sie sich nur mit Dateien befassen, die tatsächlich ausgeführt werden, wie z. B. .bash_profiles und friends, können Sie möglicherweise nicht mehr z. B. unameanhand des Systems, auf dem der Code ausgeführt wird, differenzieren.

Zum Beispiel völlig ungetestet und mit dem Vorbehalt, dass ich kein OS X zum Ausprobieren habe, wenn Sie momentan unter Linux arbeiten:

alias ll='ls -lFA'

und unter Mac OS X:

alias ll='ls -lFAx'

(Wo -xlässt OS X lsetwas machen, was GNU standardmäßig macht), dann können sie zu so etwas kombiniert werden:

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...

Die einzige Voraussetzung ist dann, dass dies uname -sgrößtenteils auf die gleiche Weise funktioniert (dies sollte der Fall sein, da beide Systeme vernünftigerweise POSIX-y und uname -s sind (danke Marco für den Hinweis )) und die Syntax für die Verzweigung von Shell-Skripten basierend auf einem String-Vergleich ist das gleiche. Sie können wahrscheinlich auch anhand anderer Kriterien testen. Sie könnten zB nach / etc / lsb_release suchen, prüfen, ob / proc / sys / kernel / ostype "Linux" enthält oder welche anderen Tests Sie sich vorstellen können.

ein CVn
quelle
@ RaphaelAhrens Es ist Darwin, ich habe gerade nachgesehen.
k0pernikus
@RaphaelAhrens Wie ich geschrieben habe, habe ich kein OS X zum Ausprobieren. Daher habe ich die Idee erraten, anstatt viel Zeit mit einem relativ unbedeutenden Detail zu verbringen, das das OP trivial herausfinden kann.
einen Lebenslauf vom
Wikipedia zur Rettung en.wikipedia.org/wiki/Uname wenn jemand anderes dort für Windows oder andere Sachen bash will.
Raphael Ahrens
1
Der uname- -oSchalter ist kein POSIX-Schalter und fällt auf vielen Systemen aus, z. B. Solaris. -sist unter POSIX obligatorisch und die kompatibelste Methode. IEEE Std 1003.1
Marco
2
OSTYPEist in einer POSIX-Shell nicht verfügbar. Es schlägt beispielsweise bei einer FreeBSD-Standardinstallation fehl und kann nur in .bashrcoder verwendet werden .zshrc. Es funktioniert nicht zuverlässig .profile, .aliasusw. Da reden wir über Unverträglichkeiten hier, ich empfehlen würde den sicheren Weg zu gehen, statt auf bestimmte Shell-Funktionen zu verlassen, die auf jedem System verfügbar sein nicht garantiert werden.
Marco