Programming
というサブフォルダにあるファイルからデータを読み込むというフォルダにbashスクリプトがあるとしますdata
。
スクリプトのファイルパスはすべて、この「プログラミング」フォルダに相対的です。
echo "test" > ./data/test.txt
。
したがって、作業ディレクトリは常に「Programming」フォルダである必要があります。
スクリプトがすべてのテストに合格すると完了し、「Programming」フォルダーの内容全体をサブフォルダーに簡単にコピーし、次に「/opt
script linked to」というフォルダーにシンボリックリンクを作成して環境から接続できると思いました。 。/opt/myapplication
/usr/bin
myapplication
/opt/myapplication/bash_script
しかし、問題は私の作業ディレクトリがある場所でmyapplicationを呼び出すことで問題になります。
$PWD= #actual shell directory at script start
$0=/usr/bin/myapplication
${BASH_SOURCE[0]}=/usr/bin/myapplication
申請に失敗しました。私はシンボリックリンクが作業ディレクトリをファイルがある場所に変更すると思いました。
Unixの一般的な慣行は何ですか?常に実行可能ファイルがある場所に作業ディレクトリを設定して相対パスを使用しますか?
答え1
Unixの一般的な慣行は何ですか?常に実行可能ファイルがある場所に作業ディレクトリを設定して相対パスを使用しますか?
実際にはそうではありません。ほとんどの場合、$0
これに基づいてスクリプト内でaを使用して実行できますが、表示される内容は相対パス自体であるか、シンボリックリンクを介したパスである可能性があるため、あまり役に立ちません。cd
$0
(argv[0]
呼び出し元から直接インポートされたバイナリ実行可能ファイルの場合、Bashはexecve()
呼び出しに含まれるものとして設定できます。(exec -a anything /path/to/file)
これは、スクリプトの起動方法によってスクリプト内で動作が異なります。)$0
しかし、もう一つの質問はこれを行うべきかどうかです。一般的なアイデアは、ツールをいくつかのディレクトリに置き、PATH
データファイルがあるディレクトリでツールを使用することです。これにより、複数のユーザーが複数のデータファイルセットで1つのツールを使用できるようになります。
デフォルトパスを設定するもう1つの一般的な方法は、環境変数を使用することです。スクリプトにこのような内容が含まれている場合、if [ -d "$MYAPP_DIR" ]; then cd "$MYAPP_DIR"; fi
ユーザーはMYAPP_DIR
必要に応じてシェルの起動ファイルに設定できます。
もちろん、ツールには、ツールに付属のいくつかの静的データが必要な場合があります。これを見つけるには、いくつかの可能性があります。
- 静的データがどこにあるかを知るには、設定ファイルの固定パスを使用します。固定パスは通常次のとおりです
/etc/mytool/config
。ここでの欠点は、管理者以外のインストールでは機能しないことです。 - 場所はコンパイル時に設定され、バイナリ自体に保存されます。データパスは通常と似ています
/usr/share/lib/mytool/whatever
が、他のものかもしれませんが、インストールの存続期間中は変更されない可能性があります。 (これは一般的なことだと思いますが、どうすれば醜い感じもします。) - 環境変数を使用してください。ここでの欠点は、ユーザーが何でも機能するように設定する必要があることです。したがって、他の方法の代替/オーバーライドとして使用するのが最善です。