過去5年間、私は科学コンピューティングを実行するための日常的なオペレーティングシステムとしてLinuxを使用してきました。私の仕事は最近Macを提供しており、今後数ヶ月間デフォルトユーザーになります。 MacのFree-BSD bash環境とおなじみのGNU環境の間でクラッシュが発生し続けます。どちらの環境も、私が設定したbashスクリプトとbashコマンド(coreutils
、findutils
など)を実行しようとしたときに発生します。 HPCだけでなく、他のすべてのコンピュータがLinuxとGNUユーティリティを使用しているため、Free-BSDユーティリティに完全に切り替えたくありません。私は2つのbashスクリプトセットを維持し、2つのシステム間の異なるフラグと機能の微妙な違いを覚えておく必要がありません。また、他のユーザーが使用するMac GUIユーティリティなどを破損したくありません(今後数ヶ月以内に、または他のユーザーに提供するとき)。さらに、次のことに答えてください。これ関連する問題は、Mac Free-BSDユーティリティをGNUユーティリティに完全に置き換えないように警告します。
システムFree-BSDユーティリティを維持しながら、GNUユーティリティのみを使用するように別々のbash環境をインストール/設定できますか? 私が期待する最も有望なオプションは、$PATH
Free-BSD実行可能ファイルを無視しながら、GNU実行可能ファイル(および対応する完全修飾名)を含むディレクトリを指すように変数を設定することです。これをクロスプラットフォームのbashスクリプトにどのように適用できますか?検討する他のオプションはありますか?
ベストアンサー1
まず、これだけcoreutils
。 BSDに対応牛に似た一種の栄養findutils
道路とても違う、ほぼすべてのコマンドは、次に関連付けられています。動的接続などが異なります。
さらに、バージョンの違いも処理する必要があります。 OSこれ自動ツールまた、主要なLinuxディストリビューションに比べて古いことが多い。
質問の重要な部分に対する答えは次のとおりです。 「もちろん、使える理由は何ですか?」自分で作ったこれらの代替GNUツールをすべてインストールするには、ファイルに最初のツールを置いて、その$(brew --prefix coreutils)/libexec/gnubin
ツールが最初に見つかったことを確認してください。/usr/local/bin
PATH
export PATH="$(brew --prefix coreutils)/libexec/gnubin:/usr/local/bin:$PATH"
何らかの理由でパッケージが別の場所にインストールされている場合は、その内容も変数 brew
に含めてください。PATH
いくつかのパッケージのみを交換したい場合は、トリッキーな部分はすべての名前変更を処理することです。brew
GNUをインストールするときなど、コアオペレーティングシステムにすでに実装されているプログラムをインストールするたびにそのバージョンの名前が異なるようにcoreutils
指定されているため、必要に応じてそのプログラムのいずれかを実行できます。これらすべてのシンボリックリンクの名前を変更するのではなく、1これらすべての問題を解決するために間接層を使用することをお勧めします。
$ mkdir ~/linux
$ cd ~/linux
$ ln -s /usr/local/bin/gmv mv
...etc for all the other tools you want to rename to cover OS versions
$ export PATH=$HOME/linux:$PATH
...try it out...
新しい環境に慣れたら、export PATH=$HOME/linux:$PATH
を移動できます~/.bash_profile
。
これは、バッチ交換でもシングルアプリケーション交換でも、対話型の使用を処理します。
残念ながら、シェルスクリプトの問題は完全には解決されません。たとえば、シェルスクリプトが独自の環境を取得する場合がありますcron
。この場合、PATH
各クロスプラットフォームシェルスクリプトの上部を変更できます。
#!/bin/bash
export PATH="$HOME/linux:$(brew --prefix coreutils)/libexec/gnubin:/usr/local/bin:$PATH"
これを条件に設定する必要はありません。ただシェルにプログラムを見つけるための別の場所を提供するからです。
脚注
- 例えば
/usr/local/bin/gmv
→../Cellar/coreutils/$version/bin/gmv
関連記事