ドットファイルをシステムに依存しないようにする方法は?


21

仕事のために、最近、OS Xの使用を開始し、Linuxと同様のエクスペリエンスを得るためにhomebrewを使用してセットアップしました。

ただし、設定にはかなりの違いがあります。一部は、1つのシステムに配置するだけで十分です。私のドットファイルはgitリポジトリにあるため、どのようなスイッチを設定できるのか疑問に思っていました。そのため、一部の設定はLinuxシステム用とOS X用にのみ読み込まれます。

ドットファイルに関しては、とりわけ、.bash_profilesまたはを参照してい.bash_aliasます。


これはgitブランチで行いました。FreeBSD、Gentoo、Ubuntu用に1つあります。しかし、これは理想的ではありません。
ラファエルアーレンス

@RaphaelAhrens分岐しやすいブランチベースのソリューションは避けたいと思います。
k0pernikus

ええ、システム固有のものを特別なファイルに入れると、少し簡単になります。しかし、私が言ったように理想的ではありません。
ラファエルアーレンス

stackoverflow.com/questions/394230/...あなたはOS X上のダーウィンを確認することができます
ラファエルアーレンス

私のアプローチは基本的にに要約されif (exists rcfile.local); source rcfile.local; endif、適切なrcファイルに変換されます。メインのrcファイルはシステムに依存しないようにしてい.localますが、バージョンにはシステム固有の設定があります。すべてを単一のレポジトリで必要とする場合は、システムディレクトリを作成し、rcfile.localを正しいディレクトリにあるものにシンボリックリンクできます。
jw013

回答:


22

ドットファイルは可能な限り移植性を保ち、特定のバージョンのツールを必要とするOS依存の設定やスイッチを避けてください。たとえば、すべてのシステムで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

uname -sのようなものunameです。unameはUnix名を表します。
ステファンシャゼル

1
@StephaneChazelasそれは偶然であるか、システム間で保証されており、私はいつでもドロップでき-sますか?
マルコ

1
はい、uname何十年もの間それを行うための標準的な方法は単独であり、POSIXで指定されています。元のuname(PWB Unixの)オプションはありませんでした。
ステファンシャゼル

@StephaneChazelas明確にしてくれてありがとう、私-sはこの回答からを削除しました。今後のスクリプトのために心に留めておきます。
マルコ

それは比較的小さな詳細であり、あなたの例で示されている点を損なうものではありませんが、vimrcの引用はset実際にはU + 0022ではなくU + 201CおよびU + 201Dであると想定されていますか?
CVn

3

.bash_profilesやfriendsなど、実際に実行されるファイルのみに関心がある場合は、たとえばuname、コードを実行するシステムに基づいて区別するために使用できます。

たとえば、完全にテストされておらず、現在Linuxを使用している場合は、試してみるOS Xがないという警告があります。

alias ll='ls -lFA'

およびMac OS Xの場合:

alias ll='ls -lFAx'

-xOS 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」が含まれているかどうか、または他に思いつくテストを確認したりできます。


@RaphaelAhrensそれはDarwin、私がチェックしたところです。
k0pernikus

@RaphaelAhrens私が書いたように、私は物事を試すOS Xを持っていないので、OPが些細なことを見つけることができる比較的些細な詳細に多くの時間を費やすのではなく、考えを示すためにワイルドな推測をしました。
CVn

Wikipedia to the rescue en.wikipedia.org/wiki/Uname他の誰かがWindowsや他のもののためにbashを必要とするなら。
ラファエルアーレンス

1
uname -oスイッチはPOSIXではなく、Solarisなどの多くのシステムで失敗します。-sPOSIXでは必須であり、最も互換性のある方法です。IEEE Std 1003.1-
マルコ

2
OSTYPEPOSIXシェルでは使用できません。たとえば、デフォルトのFreeBSDインストールでは失敗し、.bashrcまたはでのみ使用できます.zshrc。それは確実では動作しません.profile.alias代わりに、すべてのシステム上で利用可能であることが保証されていない特定のシェルの機能、に依存するので、私たちはここにcompatibiliyの話をしているので、私は安全な道を行くためにアドバイスしたい、など。
マルコ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.