過去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
関連記事
答え2
VMボックスやデュアルブートを使用せずにfreebsdを使用してデフォルトでGNUを実行できない場合は、この回答を試す方法としてここに入れます。
前述のように、homebrewはすべてのGNU coreutilをインストールすることはできません。私が間違っている場合は訂正してください。しかし、すべてのファイルを1つの場所(1つのコンピュータ)に保存することもできます。
インターネットに接続されているセカンダリコンピュータ(Raspberry Piなど)がある場合は、MacのLinuxボックスにSSHで接続できます。または、X環境を使用する場合は、コンピュータのLinuxコンピュータでx11vncを使用できます。りんご。
SSHを使用している場合は、ログインシェルにのみアクセスできることに注意してください。
SSHサーバーとクライアントの作成方法
まず、opensshサーバーがLinuxシステムで実行されていることを確認してください。
$ service ssh status
サービスが実行されると、次の出力が表示されます。
ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2015-07-17 16:51:08 NPT; 5h 21min ago
Process: 1669 ExecReload=/bin/kill -HUP $MAINPID (code=exited, status=0/SUCCESS)
Main PID: 615 (sshd)
CGroup: /system.slice/ssh.service
└─615 /usr/sbin/sshd -D
サービスが実行されていない場合は、まずopensshがインストールされていることを確認してください。
sudo apt-get install openssh
その後サービス開始
sudo service ssh start
すべてが完了しました! (もちろんキーを生成したくない場合)
SSH経由でLinuxシステムにログインできるようになりました。
ssh <USERNAME_ON_LINUX_MECHINE>@<LINUX_HOST_NAME>
Linux ホスト名は、デフォルトでシステムの外部 IP アドレスです。
(もちろん、Macにもopensshをインストールする必要があります)
SSHトンネリングの完全なチュートリアルは次のとおりです。
http://inside.mines.edu/fs_home/gmurray/HowTo/sshNotes.html
x11vncサーバーとクライアントの使用方法
私はvncがSSHのより良い形だと思います。 (私の個人的な意見) VNCはSSHよりもインストールしやすい
以下はvncを設定するためのArch-wikiリンクです。 https://wiki.archlinux.org/index.php/X11vnc
x11vncのインストール
sudo apt-get install x11vnc
ユーザーのパスワードを作成します。
x11vnc -storepasswd
SSH設定がある場合は、ログインしている場合はx11vncを起動できますが、パスワードファイルを使用するように指示する必要があります。
x11vnc -usepw
lightdmを使用してログインしていると仮定すると、次のようにx11vncを起動してこの問題を解決できます。
sudo x11vnc -xkb -noxrecord -noxfixes -noxdamage -display :0 -auth /var/run/lightdm/root/:0 -usepw