複数のディレクトリがあるとしましょう。
/Users/user1/ApplicationThing/
/Users/user1/Documents/
/Users/user1/other/directory/it/doesnt/matter/
main.sh
.../ApplicationThing/
その中に他のファイルにも依存するファイルがあるとしましょうdependancy.sh
。
私は別のディレクトリにあり、コンテンツディレクトリがシステム内の他のすべてのディレクトリにあるmain.sh
かのようにWDを私のCWDとして実行できるようにしたいと思います。.../ApplicationThing/
とは異なり、$PATH
コンテンツは実際にはディレクトリ内にあるように見えますが、オートコンプリート機能にはありませんls -l
。
答え1
これは、他の作業ディレクトリに呼び出されても、特定の場所で依存関係を見つけるためにApplicationThingを変更する必要があるように聞こえます。
環境変数を設定することでこれを行うことができます。
export ApplicationThingHome=/Users/user1/ApplicantionThing
対応する変数値を使用するすべての依存関係を参照しますmain.sh
(変数が設定されていない場合は、適切なデフォルト値を選択できます)。
${ApplicationThingHome:-/usr/local/ApplicationThingDefaultDir}/dependancy.sh
変える
./dependancy.sh
main.sh
その後、そのディレクトリを任意のディレクトリに配置し、任意のディレクトリ$PATH
で使用できます。
提案されたソリューションに問題があります。別のディレクトリにある場合、またはというファイルを作成したい場合は、最終的にApplicationThingに対応するファイルを上書きしますmain.sh
。dependency.sh
文字通り、main.sh
ApplicationThingに属するディレクトリ以外のディレクトリを持つことも使用することもできません。ディレクトリは、このような問題を避けるように設計されています!
main.sh
もちろん、「ダミーファイル」が最初に実行された場合にのみ存在するように条件を作成できます。ただしmain.sh
、問題が解決しない場合に表示される内容を表示するには、別のツールセットが必要です。あなたが期待するものを実行している間。
ApplicationThingを変更できない場合は、ラッパースクリプトを生成してシステムのどこからでもApplicationThingを呼び出すことができます。それ$ PATHに含まれるディレクトリのスクリプト:
#!/bin/sh
# set the correct working directory for silly ApplicationThing
cd /Users/user1/ApplicationThing
# if ApplicationThing has any other environment requirements,
# this would be a great place to ensure they're satisfied too.
# Now execute the main.sh of ApplicationThing, giving it any
# command line arguments that were given to this script, exactly as-is.
exec ./main.sh "$@"
スクリプトは別々のプロセスで実行されるため、スクリプトcd
のコマンドはスクリプトを呼び出すセッションにはまったく影響しません。exec
runningキーワードはmain.sh
シェルとmain.sh
。
このアプローチでは、ファイル名を引数として渡す場合は絶対パス名として指定する必要があります。すべての相対パス名は、呼び出しセッションのCWDではなくApplicationThingディレクトリに基づいてmain.sh
解釈されるためです。main.sh
これが問題になる場合は、コマンドライン引数をmain.sh
。このStackExchangeの質問以下はあなたに適用できるいくつかのアイデアです。