Как сохранить dotfiles системно-независимым?

21

Из-за работы я недавно начал использовать OS X и настроил его с помощью homebrew, чтобы получить такой же опыт, как с Linux.

Тем не менее, есть довольно много различий в их настройках. Некоторые только должны быть на месте в одной системе. Поскольку мои точечные файлы находятся в репозитории git, мне было интересно, какой тип переключателя я мог бы установить, чтобы некоторые конфигурации читались только для системы Linux, а другие - для OS X.

Что касается точечных файлов, я имею в виду, среди прочего, .bash_profilesили .bash_alias.

k0pernikus
источник
Я сделал это с ветками Git. У меня есть один для FreeBSD, Gentoo и Ubuntu. Но это не идеально.
Рафаэль Аренс
@RaphaelAhrens Я хочу избежать такого решения, основанного на ветвях, поскольку оно может расходиться.
k0pernikus
Да, вы можете сделать это немного легче, когда вы помещаете специфичные для системы вещи в специальные файлы. Но, как я сказал, не идеал.
Рафаэль Аренс
stackoverflow.com/questions/394230/… Вы можете проверить наличие Дарвина в OS X.
Рафаэль Аренс
Мой подход в основном сводится к if (exists rcfile.local); source rcfile.local; endifпереводу в соответствующий файл RC. Основной rc-файл, который я пытаюсь сохранить независимым от системы, в то время как .localверсия имеет системные настройки. Если вы хотите все это в одном репо, вы можете иметь системные директории и символическую ссылку на файл rcfile.local с тем, который находится в правильном каталоге.
jw013

Ответы:

22

Держите точечные файлы как можно более переносимыми и избегайте зависящих от ОС настроек или переключателей, которые требуют определенной версии инструмента, например, избегайте синтаксиса GNU, если вы не используете программное обеспечение GNU во всех системах.

Вы, вероятно, столкнетесь с ситуациями, когда желательно использовать системные настройки. В этом случае используйте оператор switch с индивидуальными настройками:

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

Если для файлов конфигурации произвольных приложений требуются разные параметры, вы можете проверить, предоставляет ли приложение переключатели совместимости или другие механизмы. Для vim, например, вы можете проверить версию и поддержка для номера патчей имеется более старые версии или версии , скомпилированные с различным набором функций, не имеют. Пример фрагмента из .vimrc:

if v:version >= 703
  if has("patch769")
    set matchpairs+=“:”
  endif
endif
Marco
источник
uname -sэто как uname. uname обозначает имя Unix.
Стефан Шазелас
1
@StephaneChazelas Так получилось или это гарантировано для всех систем, и я всегда могу отбросить -s?
Марко
1
да, unameодин был каноническим способом сделать это в течение многих десятилетий и определен POSIX. Оригинал uname(в PWB Unix) не выбрал ни одного варианта.
Стефан Шазелас
@StephaneChazelas Спасибо за разъяснения, я удалил -sиз этого ответа, и я буду помнить это для моих будущих сценариев.
Марко
Это относительно незначительная деталь, которая не умаляет значения, проиллюстрированного вашим примером, но setдействительно ли эти кавычки в vimrc должны быть U + 201C и U + 201D, а не U + 0022?
CVn
3

Если вас интересуют только файлы, которые на самом деле выполняются, такие как .bash_profiles и друзья, вы можете обойтись без использования, например, unameдля дифференциации на основе системы, на которой работает код.

Например , полностью непроверенный и с оговоркой, что у меня нет OS X, чтобы попробовать что-то, если у вас сейчас есть Linux:

alias ll='ls -lFA'

и в Mac OS X:

alias ll='ls -lFAx'

(где -xзаставляет OS X lsделать то, что GNU ls делает по умолчанию), тогда их можно объединить в нечто вроде этого:

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

Единственное требование - это то, что он uname -sработает в основном одинаково (так должно быть, поскольку обе системы разумно используют POSIX-y и uname -s требуется POSIX (спасибо Marco за это ), и что синтаксис для ветвления сценария оболочки на основе сравнения строк то же самое. Вы можете, вероятно, проверить на основе других критериев; Например, вы можете найти / etc / lsb_release, проверить, содержит ли / proc / sys / kernel / ostype «Linux», или какие-либо другие тесты, которые вы можете создать.

CVn
источник
@RaphaelAhrens Это Darwin, я только что проверил.
k0pernikus
@RaphaelAhrens Как я уже писал, у меня нет OS X, чтобы примерить что-то, поэтому я решил сделать дикую догадку, чтобы показать идею, а не тратить много времени на одну относительно незначительную деталь, которую тривиально узнает ОП.
CVn
Википедия на помощь en.wikipedia.org/wiki/Uname, если кто-то еще хочет, чтобы bash для Windows или других вещей.
Рафаэль Аренс
1
Переключатель uname -oне является POSIX и не работает во многих системах, например в Solaris. -sявляется обязательным для POSIX и наиболее совместимым способом. IEEE Std 1003.1
Марко
2
OSTYPEнедоступен в оболочке POSIX. Сбой, например, при установке FreeBSD по умолчанию и может быть использован только в .bashrcили .zshrc. Она не работает надежно .profile, .aliasи т.д. Так как мы говорим о здесь совместимости, я бы посоветовал пойти безопасный путь, вместо того , чтобы полагаться на особенности конкретного интерпретатора, которые не гарантированы будут доступны в каждой системе.
Марко