Bagaimana cara menjaga sistem dotfiles-agnostik?

21

Karena bekerja, saya baru-baru ini mulai menggunakan OS X dan telah mengaturnya menggunakan homebrew untuk mendapatkan pengalaman yang sama dengan Linux.

Namun, ada beberapa perbedaan dalam pengaturannya. Beberapa hanya perlu ada di satu sistem. Ketika dotfiles saya tinggal di repositori git, saya bertanya-tanya seperti apa saklar yang bisa saya atur, sehingga beberapa konfigurasi hanya bisa dibaca untuk sistem Linux dan lainnya untuk OS X.

Adapun dotfiles, saya maksudkan, antara lain, ke .bash_profilesatau .bash_alias.

k0pernikus
sumber
Saya melakukan ini dengan cabang git. Saya punya satu untuk FreeBSD, Gentoo dan Ubuntu. Tapi ini tidak ideal.
Raphael Ahrens
@ RaphaelAhrens Saya ingin menghindari solusi berbasis cabang seperti itu cenderung menyimpang.
k0pernikus
Ya, Anda dapat membuatnya sedikit lebih mudah ketika Anda memasukkan hal-hal khusus sistem ke dalam file khusus. Tapi seperti yang saya katakan tidak ideal.
Raphael Ahrens
stackoverflow.com/questions/394230/… Anda dapat memeriksa Darwin di OS X.
Raphael Ahrens
Pendekatan saya pada dasarnya bermuara pada if (exists rcfile.local); source rcfile.local; endif, diterjemahkan ke file rc yang sesuai. File rc utama saya mencoba untuk menjaga sistem agnostik, sedangkan .localversi memiliki pengaturan sistem khusus. Jika Anda ingin semuanya dalam satu repo, Anda dapat memiliki sistem dir dan symlink rcfile.local dengan yang ada di direktori yang benar.
jw013

Jawaban:

22

Pertahankan dotfiles senyaman mungkin dan hindari pengaturan yang bergantung pada OS atau sakelar yang memerlukan versi khusus alat, mis. Hindari sintaksis GNU jika Anda tidak menggunakan perangkat lunak GNU pada semua sistem.

Anda mungkin akan mengalami situasi di mana diinginkan untuk menggunakan pengaturan khusus sistem. Dalam hal ini gunakan pernyataan sakelar dengan pengaturan individual:

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

Jika file konfigurasi aplikasi sewenang-wenang memerlukan opsi yang berbeda, Anda dapat memeriksa apakah aplikasi menyediakan sakelar kompatibilitas atau mekanisme lainnya. Untuk vim, misalnya, Anda dapat memeriksa versi dan patchlevel dukungan fitur versi lama, atau versi dikompilasi dengan set fitur yang berbeda, tidak memiliki. Cuplikan contoh dari .vimrc:

if v:version >= 703
  if has("patch769")
    set matchpairs+=“:”
  endif
endif
Marco
sumber
uname -sseperti uname. uname singkatan dari nama Unix.
Stéphane Chazelas
1
@StephaneChazelas Itu kebetulan atau apakah dijamin di seluruh sistem dan saya selalu bisa membatalkannya -s?
Marco
1
ya, unamesendirian telah menjadi cara kanonik untuk melakukannya selama beberapa dekade dan ditentukan oleh POSIX. Yang asli uname(di PWB Unix) tidak mengambil opsi apa pun.
Stéphane Chazelas
@StephaneChazelas Terima kasih atas klarifikasi, saya menghapus -sdari jawaban ini dan saya akan mengingatnya untuk skrip saya di masa depan.
Marco
Ini adalah detail yang relatif kecil dan tidak mengurangi titik yang diilustrasikan oleh contoh Anda, tetapi apakah kutipan di vimrc setbenar-benar seharusnya U + 201C dan U + 201D daripada U + 0022?
CVn
3

Jika Anda hanya peduli dengan file yang benar-benar dieksekusi, seperti .bash_profiles dan teman-teman, Anda mungkin dapat menggunakan mis unameuntuk membedakan berdasarkan sistem yang dijalankan oleh kode.

Misalnya , benar-benar belum teruji dan dengan peringatan bahwa saya tidak memiliki OS X untuk mencoba berbagai hal, jika saat ini ada di Linux:

alias ll='ls -lFA'

dan di Mac OS X:

alias ll='ls -lFAx'

(di mana -xmembuat OS X lsmelakukan sesuatu yang dilakukan GNU secara default), maka mereka dapat digabungkan menjadi sesuatu seperti ini:

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

Satu-satunya persyaratan kemudian adalah bahwa uname -ssebagian besar berfungsi dengan cara yang sama (seharusnya, karena kedua sistem cukup POSIX-y dan uname -s diperlukan oleh POSIX (terima kasih Marco untuk menunjukkan ini )), dan bahwa sintaks untuk percabangan skrip shell berdasarkan perbandingan string adalah sama. Anda mungkin dapat menguji berdasarkan kriteria lain juga; misal, Anda bisa mencari / etc / lsb_release, periksa apakah / proc / sys / kernel / ostype berisi "Linux", atau tes apa pun yang dapat Anda lakukan.

sebuah CVn
sumber
@ RaphaelAhrens Ini Darwin, saya baru saja memeriksa.
k0pernikus
@RaphaelAhrens Seperti yang saya tulis, saya tidak memiliki OS X untuk mencoba berbagai hal, jadi saya mengambil tebakan liar untuk menunjukkan ide daripada menghabiskan banyak waktu pada satu detail yang relatif tidak signifikan yang dapat dengan mudah diketahui oleh OP.
CVn
Wikipedia untuk menyelamatkan en.wikipedia.org/wiki/Uname jika orang lain ingin ada bash untuk Windows atau hal lainnya.
Raphael Ahrens
1
-oSakelar uname bukan POSIX dan gagal pada banyak sistem, misalnya Solaris. -swajib pada POSIX dan cara yang paling kompatibel. IEEE Std 1003.1
Marco
2
OSTYPEtidak tersedia dalam shell POSIX. Ini akan gagal misalnya pada instalasi FreeBSD default dan hanya dapat digunakan dalam .bashrcatau .zshrc. Ini tidak bekerja dengan andal dalam .profile, .aliasdll. Karena kita berbicara tentang kompatibilitas di sini, saya menyarankan untuk pergi dengan cara yang aman, daripada mengandalkan fitur shell tertentu, yang tidak dijamin tersedia di setiap sistem.
Marco