私はBash 4.3.48(1)を使用しており、テストVPSシステムで次のコマンドパターンを実行しています。
rm -rf ${drt}/${pma}*
このコマンドは、オペレーティングシステム全体(Ubuntu)を削除します。これは、cd /
次のエラーのみを返す実行によって明らかになります。
bash:cd /:そのファイルまたはディレクトリはありません。
詳しくは、上記の元のコマンドで変数が宣言されていないため、これが発生します。
~/repoName/assignments_variables.sh
エクスポートした変数のリスト(drt
および含む)を含むファイルを作成しましたpma
。代わりに
source /etc/bash.bashrc
runningを実行しました/etc/bash.bashrc
が、これはファイルが現在のセッションにのみ関連しているため無効です(後で子セッションでデータを実行するファイル自体を実行するために使用できますが)。
これで、間違ったパスが問題の一般的な原因であることが明らかになりました。もっと深く掘り下げて、次の質問をしたいと思います。
rm -rf
間違った変数拡張が無視され続けるのはなぜですか/*
?rm -rf
ディレクトリを削除する必要があることを知っています。ただ見つかった場合は、存在しないディレクトリへの部分パスに依存してはいけません(/*
オペレーティングシステムが削除される可能性があります)。rm -rf
将来の可能性のある同様の誤ったパス状況(誤った変数拡張のため)を処理するために、このコマンドをどのように改善できますか?
Bashが(指示を元に戻すまで)空の変数を拡張しないようにするBashディレクティブはありますか?
これを強調したいです。私は通常バックアップするのではなく、二重バックアップをします。これは実際にバックグラウンドでx3バックアップを使用するテスト環境です。
ベストアンサー1
変数が存在しない場合、何が拡張されますか?
試してみましょう(エコに注意してください):
$ unset drt pma
$ echo rm -rf ${drt}/${pma}*
rm -rf /bin /boot /dev /etc /hello /home /initrd.img /lib /lib32 /lib64 /libx32 /media /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var /vmlinuz /vmlinuz.old
これがシステム全体です(すでに確認したように)。
問題はシェルによる拡張です。
防止
これが起こらないようにするにはどうすればよいですか?
シェルが空の変数を拡張するのを防ぎます。 varが空であるか設定されていない場合、
拡張が発生します。${var:?message}
message
そして実行が停止しました(致命的なエラー)。テストを受けてください:
$ echo rm -rf "${drt:?Missing variable drt}"/"${pma:?Missing variable pma}"*
そして、このソリューションはPOSIXと互換性があります。