親ディレクトリを PATH にマップした相対パスを使用してスクリプトを呼び出すにはどうすればよいでしょうか?

親ディレクトリを PATH にマップした相対パスを使用してスクリプトを呼び出すにはどうすればよいでしょうか?

/usr/bin/vendor/慣例によりに追加されPATH、たとえばシェル スクリプト を含むフォルダーがありますdo_something.sh。ここで、1 つ以上の Perl スクリプトをグループ化してさらに保存するためのサブフォルダーを追加したいと思います。/usr/bin/vendor/some_tool/これらのスクリプトは同じ目的を持ち、Eclipse プロジェクト ファイル、場合によっては構成ファイルなども管理する必要があるためです。最終的には、/usr/bin/vendor/some_tool/do_a.plと を取得する可能性があります/usr/bin/vendor/some_tool/do_b.pl

のおかげで、どこからでもPATH簡単に呼び出すことができます。しかし、同じようにdo_something.sh呼び出す方法はありますか? 実際には、その相対パスを使用して、のタスクを実行していることがわかります。これは、相対 dir 構造を使用して実装したい言葉遣い/命名規則です。some_tool/do_a.plsome_tool/do_a.pldo_asome_tool

シェルで試してみましたが、もちろん動作しませんでしたが、何か間違っているのかもしれません。一般的には動作するはずです。しかし、そうではないはずなので、唯一の回避策は、/usr/bin/vendor/some_tool_do_a.shすべての引数を に転送するファイルを作成することです/usr/bin/vendor/some_tool/do_a.pl

答え1

マニュアルbashページには次のように記載されています

   PATH   The  search  path for commands.  It is a colon-separated list of
          directories in which the shell looks for commands  (see  COMMAND
          EXECUTION  below).

そしてこう続ける。

   If  the name is neither a shell function nor a builtin, and contains no
   slashes, bash searches each element of the PATH for  a  directory  con‐
   taining  an  executable  file  by that name.

したがって、答えは「いいえ、あなたがやりたいことは ではサポートされていませんbash」のようです。

答え2

いいえ、これは不可能です。入力したコマンド内の any は絶対パス(最初の文字の場合)または現在のディレクトリに対する相対パスに/なり、エントリ内の相対パスにはなりません。/PATH

回避策としては、次の/usr/bin/vendor/some_tool/ようにすべてのスクリプトをリンクすることが考えられます/usr/bin/vendor/

ln [-s] /usr/bin/vendor/some_tool/* /usr/bin/vendor/

ハードリンクまたはソフトリンクのいずれかを使用できます。

スクリプトを呼び出すときに常に同じ作業ディレクトリ (または少数のディレクトリ) にいる場合は、このディレクトリ (または各ディレクトリ) から相対リンクを作成する方が簡単な答えになる場合があります。

ln -s /usr/bin/vendor/some_tool .

この場合は、シンボリック リンクを使用する必要があります。

他の回避策としては、この機能を実行するための短い名前のスクリプトを定義し、次のように呼び出すことが考えられます。

tl some_tool/do_a.pl

tl渡されたパラメータを解析し、PATH各コンポーネント内のスクリプトをステップごとに探して、スクリプトへのフルパスを呼び出します。

答え3

「メイン」スクリプトで実行する内容:

mydir=$(dirname "$0")
"$mydir/subdir/otherscript"

子要素と子要素の相対的な位置が変わらないように一緒に移動されている限り、メイン スクリプトは常に子要素を見つけます。

関連情報