Nokta dosyalarını sistem agnostik tutmak nasıl?


21

İşimden dolayı son zamanlarda OS X'i kullanmaya başladım ve Linux ile benzer bir deneyim elde etmek için homebrew kullanarak kurdum.

Ancak, ayarlarında oldukça az fark var. Bazılarının yalnızca bir sistemde bulunması gerekir. Nokta dosyalarım git deposunda yaşarken, bazı yapılandırmaların yalnızca Linux sistemi ve OS X için okunması için ne tür bir anahtar kullanabileceğimi merak ediyordum.

Nokta dosyalarına gelince, diğerlerinin yanı sıra .bash_profilesveya ile ilgili olarak atıfta bulunuyorum .bash_alias.


Bunu git şubeleriyle yaptım. FreeBSD, Gentoo ve Ubuntu için bir tane var. Ancak bu ideal değildir.
Raphael Ahrens

@RaphaelAhrens Ben ayrılmaya eğilimli olduğu gibi şube tabanlı bir çözümden kaçınmak istiyorum.
k0pernikus

Evet, sisteme özel şeyleri özel dosyalara koyduğunuzda biraz daha kolaylaştırabilirsiniz. Ama dediğim gibi ideal değil.
Raphael Ahrens

stackoverflow.com/questions/394230/… OS X'de Darwin'i kontrol edebilirsiniz.
Raphael Ahrens

Benim yaklaşımım temelde if (exists rcfile.local); source rcfile.local; endifuygun rc dosyasına çevrilmiş olarak kaynıyor . .localVersiyon sisteme özgü ayarlara sahipken ana rc dosyası sistemi agnostik tutmaya çalışıyorum . Hepsini tek bir depoda istiyorsanız, sistem dizinlerine sahip olabilir ve rcfile.local komutunu doğru dizinde bulabilirsin.
jw013

Yanıtlar:


22

Nokta dosyalarını mümkün olduğu kadar taşınabilir tutun ve özel bir sürüm gerektiren işletim sistemine bağlı ayarlardan veya anahtarlardan kaçının; örneğin, tüm sistemlerde GNU yazılımı kullanmıyorsanız, GNU sözdiziminden kaçının.

Büyük olasılıkla sisteme özel ayarları kullanmanın istendiği durumlar ile karşılaşacaksınız. Bu durumda, bireysel ayarlarla bir switch ifadesi kullanın:

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

İsteğe bağlı uygulamaların yapılandırma dosyalarının farklı seçenekler gerektirmesi durumunda, uygulamanın uyumluluk anahtarları veya başka mekanizmalar sağlayıp sağlamadığını kontrol edebilirsiniz. Örneğin vim, eski sürümleri veya sahip olmadığı farklı bir özellik seti ile derlenmiş sürümleri desteklemek için sürümü ve patchlevel'i kontrol edebilirsiniz. Örnek snippet from .vimrc:

if v:version >= 703
  if has("patch769")
    set matchpairs+=“:”
  endif
endif

uname -sgibidir uname. uname, Unix isminin kısaltmasıdır.
Stéphane Chazelas

1
@StephaneChazelas Sadece oluyor mu yoksa sistemler arasında garantili -smi ve her zaman bırakabilir miyim?
Marco,

1
evet, unametek başlarına onlarca yıldır bunu yapmanın kurallı yolu olmuştur ve POSIX tarafından belirtilmiştir. Orijinal uname(PWB Unix'te) herhangi bir seçenek almadı.
Stéphane Chazelas

@StephaneChazelas Açıklama için teşekkürler -s, bu cevaptan kaldırdım ve gelecekteki senaryolarım için aklımda tutacağım.
Marco,

Bu göreceli olarak küçük bir ayrıntıdır ve örneğinizle gösterilen noktadan çıkarmaz, fakat setvimrc'deki alıntıların gerçekten U + 0022 yerine U + 201C ve U + 201D olması gerekiyor mu?
bir CVn

3

Yalnızca .bash_profiles ve friends gibi gerçekten yürütülen dosyalar ile ilgileniyorsanız, örneğin unamekodun çalıştığı sistemi temel alarak ayırt etmek için kullanmaya başlayabilirsiniz .

Örneğin , tamamen denenmemiş ve şu anda Linux kullanıyorsanız, bir şeyleri denemek için bir OS X'e sahip olmadığımı belirten ihtarla:

alias ll='ls -lFA'

ve Mac OS X'te:

alias ll='ls -lFAx'

(burada -xOS X'lerin lsGNU'ların varsayılan olarak yaptığı bir şey yapmasını sağlar), sonra şöyle bir şeyle birleştirilebilirler:

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

Tek şart, sonra olduğuna uname -sçoğunlukla aynı şekilde çalışır (bu makul POSIX-y ve her iki sistem çünkü gerektiğini 'uname -s POSIX tarafından gereklidir (teşekkürler Marco için bu out işaret )) ve bu kabuk komut dosyası dallanma sözdizimi Bir dize karşılaştırma dayalı aynıdır. Muhtemelen diğer kriterlere göre de test edebilirsiniz; örneğin, / etc / lsb_release 'ı arayabilir, / proc / sys / kernel / ostype'ın "Linux" içerip içermediğini veya ne tür testler yapabileceğinizi kontrol edebilirsiniz.


@RaphaelAhrens DarwinSadece kontrol ettim.
k0pernikus

@RaphaelAhrens Yazdığım gibi, bir şeyler denemek için bir OS X'im yok, bu yüzden OP'nin önemsiz bir şekilde öğrenebileceği görece önemsiz bir ayrıntıya çok fazla zaman harcamak yerine fikri göstermek için çılgınca bir tahminde bulundum.
CVn

Vikipedi kurtarma en.wikipedia.org/wiki/Uname eğer birisi Windows veya başka şeyler için bash istiyorsa.
Raphael Ahrens

1
Uname -oanahtarı POSIX değildir ve Solaris gibi birçok sistemde başarısız olur. -sPOSIX ve en uyumlu şekilde zorunludur. IEEE Std 1003.1
Marco,

2
OSTYPEPOSIX kabuğunda bulunmaz. Örneğin, varsayılan bir FreeBSD kurulumunda başarısız olur ve sadece .bashrcveya içinde kullanılabilir .zshrc. O güvenilir çalışmaz .profile, .aliasbunun yerine her sistemde kullanılabilir olmasını garanti edilmez özellikle kabuğunuzun özelliklerine göre hareket edilmesi, burada compatibiliy sözettiğimize, güvenli bir şekilde gitmek için tavsiye ediyorum, vb.
Marco,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.