$PATHに依存ディレクトリを持つプログラムを追加するには?

$PATHに依存ディレクトリを持つプログラムを追加するには?

私のプログラムにプログラムを追加したいのですが、コード$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変数は呼び出しプロセスからのみ継承され、呼び出し環境を汚染しません。)

関連情報