シェルスクリプトをより安全にしようとしています。何らかの理由で変数が定義されていない場合は、デフォルト値の使用を検討してください。たとえば、次のようになります。
rm -r "${OUTPUT_DIR:-/dev/null/this_path_does_not_exists}"
存在しないパスを使用することが私が思いついた解決策です。しかし、システム全体の受信者()がある場合は、/dev/null
システムに影響を与えずに安全に削除できるファイルやダミーファイルがあるのではないかと思いました。だから私の質問は次のとおりです。次のファイルはありますか?
- 破損、機能損失、またはデータ損失なしで削除可能
- 自動的に「再生」されます(システムから最初に削除されない可能性があります)。
- スーパーユーザーで削除しても削除されません。 (驚くべきことに/dev/nullが削除されることがあります:))
答え1
常に存在するがいつでも削除される可能性があるファイル(またはディレクトリ)を見つけようとするのではなく、変数を使用する前に明示的にチェックするのはどうですか?
[ -d "$OUTPUT_DIR" ] && rm -r -- "$OUTPUT_DIR"
空、存在しない、またはディレクトリ以外の項目を指している場合は、$OUTPUT_DIR
何も削除しようとしません。
答え2
rm -f
あるいは、rm -rf
何もせずに引数を渡さなくても文句を言わず、通常は-f
ユーザーにメッセージが表示されないようにスクリプトでこれを使用しようとしているので、次のようにすることもできます。
rm -rf -- ${OUTPUT_DIR:+"$OUTPUT_DIR"}
IIRCでもこれが機能することを保証できませんrm -rf -- "$OUTPUT_DIR"
。一部のシステムは空の文字列を現在の作業ディレクトリとして扱います(rm
これを拒否しなかった場合は明らかに劇的になりますrm -rf .
)。
[ -z "$OUTPUT_DIR" ] || rm -rf -- "$OUTPUT_DIR"
私の考えにはもっと長く、明確ではありません。
また見なさい:
rm -rf -- "${OUTPUT_DIR:?No output dir!}"
$OUTPUT_DIR
設定されていないか空の場合、シェルはエラーで終了します。
答え3
/dev/null/something
/dev/null
保証が存在し、ディレクトリではないため、保証は存在しません。
または、空の文字列を使用できます。これは有効なファイル名ではないことが保証されます。しかし、変数が他のものに関連付けられている場合、空の文字列は危険です。
しかし、誤って変数を設定せずに使用するかどうかを心配している場合set -u
(すべてのshスタイルシェルに適用されます)。これにより、自動的にnullを使用するのではなく、未定義の変数を使用しようとするとエラーが発生します。
(ファイルが常に存在するようにスケジュールでき、削除しようとしても成功したように見えますが、カスタマイズを使用してファイルをそのまま残します。ヒューズ。しかし、これがどのように役立つかわかりません。ここではrm
、成功を保証するファイルではなく、失敗を保証するファイルが必要です。 )
$OUTPUT_DIR
セキュリティ関連:絶対パスに設定されていない限り、オプションのように見えること-
から始めることができます。したがって--
、どのコマンドにも渡すときは必ずその前に渡さなければなりません。
rm -r -- "$OUTPUT_DIR"