私のプログラムにプログラムを追加したいのですが、コード$PATH
は複数のファイルに分割され、実行時にルートディレクトリから取得lib/
されます。
projectRootDirectory
├ programBinary
└ lib
├ someLibrary
└ someLibrary2
$PATH
依存関係の欠落に関する苦情を提起せずに、私のプログラムにこのようなものをどのように追加できますか?
私は通常バイナリファイル/usr/local/bin
を持っています
コピー
cp /path/to/programBinary /usr/local/bin
またはシンボリックリンク
cd /usr/local/bin ln -s /path/to/programBinary programBinary
しかし、どちらも依存関係を見つけることができません。
必要なファイルの/usr/local/bin
いくつかも実行可能で、私の$PATH
。
どうすればいいですか?
答え1
もちろんprojectRootDirectory
に追加することもできますが、$PATH
ここには少なくとも2つの欠点があります。
bin
あなたが説明する方法によれば、この特定のプロジェクトは、次のようにプロジェクトをサブディレクトリとしてうまく構成しないようですlib
。projectRootDirectory ├ bin │ └ programBinary └ lib ├ someLibrary └ someLibrary2
だから強制的に
projectRootDirectory
それ自体に入れなければなりませんが$PATH
、実行のためのバイナリ以外に他のものが含まれているのでちょっと見苦しいです。同様のプロジェクトが多いと、コンテンツが
$PATH
爆発的に増えて制御できなくなります。
代わりに、おそらくこの特別な場合にできる最も簡単なことは、ラッパー実行可能ファイルをに入れることです/usr/local/bin
。これは、現在の場所で「実際の」プログラムを実行する非常に単純なシェルスクリプトです。
#!/bin/sh
exec projectRootDirectory/programBinary "$@"
ラッパースクリプトはフルパス名を使用してそれを呼び出すため、通常の方法でセカンダリファイルを見つけることができます。
答え2
さまざまなレベルの複雑さを持つこの問題を解決するにはいくつかの方法があり、最も効果的な方法は「包装哲学」によって異なります。
/usr/local/bin
おそらく私が選ぶアプローチは、エクスポートされた変数(ライブラリパスに従って変更されます)を設定し、ライブラリパスからデフォルトプログラムを呼び出す以外に何もしないラッパースクリプトをディレクトリに配置することですPATH
。この場合、すべての実行可能ファイルはディレクトリにあります。 libディレクトリのみが可能です/usr/local/bin
。 (ローカルで定義されたPATH
変数は呼び出しプロセスからのみ継承され、呼び出し環境を汚染しません。)