![親ディレクトリを PATH にマップした相対パスを使用してスクリプトを呼び出すにはどうすればよいでしょうか?](https://rvso.com/image/1552392/%E8%A6%AA%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%82%92%20PATH%20%E3%81%AB%E3%83%9E%E3%83%83%E3%83%97%E3%81%97%E3%81%9F%E7%9B%B8%E5%AF%BE%E3%83%91%E3%82%B9%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%92%E5%91%BC%E3%81%B3%E5%87%BA%E3%81%99%E3%81%AB%E3%81%AF%E3%81%A9%E3%81%86%E3%81%99%E3%82%8C%E3%81%B0%E3%82%88%E3%81%84%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B%3F.png)
/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.pl
some_tool/do_a.pl
do_a
some_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"
子要素と子要素の相対的な位置が変わらないように一緒に移動されている限り、メイン スクリプトは常に子要素を見つけます。