シェル スクリプトは絶対パスまたは相対パスで動作しますか?

シェル スクリプトは絶対パスまたは相対パスで動作しますか?

いくつかのバッチ スクリプトをシェル スクリプトに変換する作業を行っています。バッチ スクリプトには cd コマンドがありますが、依然として絶対パスが使用されています。

foo.bat:

pushd
cd C:\some\directory
copy C:\some\directory\foo.txt C:\some\other\directory
popd

このスクリプトの cd は、コピーされるファイルが絶対パスを使用して呼び出されているため冗長であると思われます。これをシェル スクリプトに変換する必要があります。次の 2 つのオプションがあります。

テスト1.sh:

cp /some/directory/foo.txt /some/other/directory

テスト2.sh:

cd /some/directory
cp foo.txt /some/other/directory

最初のものは絶対パスで cp のみを使用し、2 番目のものは cd と相対パスを使用します。

私の質問は、シェル スクリプトでパスを使用するという点では、これら 2 つの例のうちどちらがより良い方法であるかということです。

余談ですが、どちらの例でも pushd/popd は必要ですか?

答え1

cdスクリプト内での呼び出しは必ずしも悪いことではありませんが、控えめに行う必要があります。 を複数回呼び出すとcd「コード臭」が発生します。通常は絶対パスが推奨されます。

cd失敗する可能性があります。エラーを適切に処理するようにしてください。

を呼び出した後はcd、相対パスは無効になります。特に、何かを準備してから別のコマンドを実行するラッパー スクリプトを作成している場合は、 を決して呼び出さないでくださいcd。ユーザーは、コマンドが元のディレクトリで実行されることを期待している可能性があります。スクリプトがコマンド ラインで渡されたファイル名を使用する場合、通常は元のディレクトリに対する相対パスになります。先頭に を付けて"$PWD/"絶対パスにすることはできますが、何か問題が発生した場合に不適切なエラー メッセージが表示されることになります。

変数にはPWD常に現在のディレクトリが含まれているため、それを別の変数に保存し、cd後で呼び出すことで元に戻すことができます。ただし、低い権限で実行されているスクリプトが元のディレクトリに戻すことができない場合や、スクリプトの実行中にディレクトリが移動される場合など、一部のエッジケースでは失敗する可能性があることに注意してください。

相対パスには注意してください。相対パスは で始まる場合があり--注意しないと で始まるコマンド引数はオプションとして解釈されます。絶対パスにはこの問題はありません。

答え2

私の経験では、それは主にあなたのニーズと好みに依存します
。これをユーザーに任せているドキュメントがたくさんあります。私が気づいたのは次のことです。

  • 絶対パスはより明確です。スクリプトを保守/変更する必要がある人 (あなたまたは他の人) は、どのディレクトリが関係しているかを常に知ることができます。
  • 絶対パスを使用すると、関連するディレクトリがスクリプトに記述している正確なパスのディレクトリであることが確実になります。
  • 相対パスは短くなりますが、作業対象のサブツリーを確実に把握する必要があります。
  • スクリプトの先頭で繰り返しパスを変数に置き換えることで短縮できます (例: /var/log/app/component/module/logfile.log -> $module_log_dir/logfile.log)

thrig が気づいたように、実行するコマンドの直前に、関連するディレクトリのチェックを追加できます。

関連情報