シェルスクリプトは絶対パスまたは相対パスと連携する必要がありますか?

シェルスクリプトは絶対パスまたは相対パスと連携する必要がありますか?

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

foo.bat:

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

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

test1.sh:

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

test2.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/comComponent/module/logfile.log - > $module_log_dir/logfile.log)。

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

関連情報