Як зберегти точкові файли системно-агностичні?


21

Завдяки роботі я нещодавно почав використовувати OS X і налаштував його за допомогою homebrew, щоб отримати схожий досвід, як у Linux.

Однак у їх налаштуваннях є досить багато відмінностей. Деяким потрібно встановити лише одну систему. Оскільки мої dotfiles живуть у сховищі git, мені було цікаво, який саме комутатор я можу встановити на місці, так що деякі конфігурації читаються лише для системи Linux, а інші для OS X.

Щодо точкових файлів, я, серед іншого, маю на увазі .bash_profilesабо .bash_alias.


Я робив це з гіткові гілки. У мене є один для FreeBSD, Gentoo та Ubuntu. Але це не ідеально.
Рафаель Аренс

@RaphaelAhrens Я хочу уникати такого галузевого рішення, оскільки воно схильне до розбіжностей.
k0pernikus

Так, ви можете зробити це трохи простіше, якщо ви поміщаєте специфічні для системи речі в спеціальні файли. Але, як я сказав, не ідеально.
Рафаель Аренс

stackoverflow.com/questions/394230/… Ви можете перевірити Darwin на OS X.
Рафаель Аренс

Мій підхід в основному зводиться до if (exists rcfile.local); source rcfile.local; endifперекладеного у відповідний файл rc. Основний файл rc я намагаюся тримати системний агностик, тоді як .localверсія має специфічні для системи налаштування. Якщо ви хочете, щоб все це було в одному репо, ви можете мати системні dirs та символізувати rcfile.local до того, що знаходиться у правильній директорії.
jw013

Відповіді:


22

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

Ви, мабуть, зіткнетеся з ситуаціями, коли бажано використовувати спеціальні налаштування системи. У такому випадку використовуйте оператор перемикання з індивідуальними налаштуваннями:

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

uname -sце як uname. uname означає ім'я Unix.
Стефан Шазелас

1
@StephaneChazelas Це просто трапляється або це гарантується в усіх системах, і я завжди можу скинути -s?
Марко

1
так, unameпоодинці було канонічним способом зробити це протягом десятиліть і визначено POSIX. Оригінал uname(у PWB Unix) не приймав жодних варіантів.
Стефан Шазелас

@StephaneChazelas Дякую за роз’яснення, я усунув -sцю відповідь, і я пам’ятатиму це про свої майбутні сценарії.
Марко

Це порівняно незначна деталь і не шкодить точці, проілюстрованій вашим прикладом, але чи справді ці лапки у vimrc setповинні бути U + 201C та U + 201D, а не U + 0022?
CVn

3

Якщо ви стосуєтеся лише файлів, які фактично виконуються, наприклад .bash_profiles та друзів, можливо, ви зможете уникнути використання, наприклад, unameдля розмежування на основі системи, на якій працює код.

Наприклад , абсолютно неперевірений і з застереженням, що у мене немає ОС 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-й і uname -s потрібні по стандарту POSIX (спасибі Марко за вказівку на це )), і що синтаксис сценарію оболонки розгалуження на основі рядкового порівняння те саме. Ви, ймовірно, можете протестувати і за іншими критеріями; наприклад, ви можете шукати / etc / lsb_release, перевірте, чи / proc / sys / kernel / ostype містить "Linux" або будь-які інші тести, які ви можете придумати.


@RaphaelAhrens Це Darwin, я щойно перевірив.
k0pernikus

@RaphaelAhrens Як я вже писав, у мене немає ОС X, щоб спробувати щось, тому я взяв дивну здогадку, щоб показати ідею, а не витрачати багато часу на одну відносно незначну деталь, яку ОП може тривіально дізнатись.
CVn

Вікіпедія на допомогу en.wikipedia.org/wiki/Uname, якщо хтось інший захоче, щоб там башти для Windows або інших речей.
Рафаель Аренс

1
Уніме- -oкомутатор не є POSIX і виходить з ладу у багатьох системах, наприклад, Solaris. -sє обов'язковим для POSIX та найбільш сумісним способом. IEEE Std 1003.1
Марко

2
OSTYPEнедоступний в оболонці POSIX. Він не вдасться, наприклад, при встановленні FreeBSD за замовчуванням і може використовуватися лише в .bashrcабо .zshrc. Він не працює надійно в .profile, .aliasі т. Д. Оскільки ми говоримо про сумісність тут, я б радив піти безпечним шляхом, а не покладатися на особливості оболонки, які не гарантовано є доступними для кожної системи.
Марко
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.