指定されたディレクトリで作業を実行する必要があるスクリプトがある場合は、すべてのパスの前にこのディレクトリを追加する方が良いですか、問題を解決してcd
作業ディレクトリに保存することをお勧めします。例えば
WORK_DIR="$1"
process data >"$WORK_DIR/result.txt"
grep "Error" "$WORK_DIR/result.txt"
または
WORK_DIR="$1"
cd "$WORK_DIR"
process data >result.txt
grep "Error" result.txt
を使用してこのスクリプトを実行すると違いがあることを知っていますが、source
これを行うための好み/便利な方法はありますか?
答え1
好ましい方法はプレフィックスを使用することです。いくつかの理由を考えることができます。
- 読んで維持する方が簡単です。
$WORK_DIR
前の最後の項目を検索するよりも、スクリプト内でgrepする方が簡単ですcd
。特に、スクリプトが長く、cd
スクリプト内で何度も実行する場合はさらにそうです。 - 特定の例では、誰かがスクリプトを編集し、「process」と「grep」の間に数行を追加することを決定した場合は、
cd
別のディレクトリに移動できます。その場合、その行grep
は失敗します。接頭辞を使用する場合、その間に何が起こるかは問題ではありません。 - スクリプトの実行中に誰かがそれらを削除して再生成すると、
$WORK_DIR
スクリプトは削除されたディレクトリにあります。プレフィックスを使用すると、ディレクトリが削除され、再作成されても新しいディレクトリに書き込まれます。
答え2
2番目の形式は、フラグを設定せずにスクリプトを実行すると危険です-e
。cd
何らかの理由で失敗すると、次の行で実行が続行されます。作業ディレクトリが変更されていなくても。これは望むものではなく、セキュリティの脆弱性になる可能性があります。