数日前、私のインターンのうちの1人が誤ってこのコードをコピーしてbash
のnode.jsにコピーしようとすると、私のラボのサーバーが深刻な被害を受けました。中括弧拡張内のスペース
$ rm -rfv /usr/{bin/node,lib/node,share/man /*/node.*};
彼らは削除するディレクトリをリストアップするbrace expansionを試してみましたが、ディレクトリの区切り(/
)間のスペースに注意してください。これにより、sudo
が適用されたため、サーバー上のすべてのファイルが削除されました。 私はこのコマンドを自分の仮想マシンで試して、rm -rf /
とほぼ同等であることを確認しました。
bash
がこの声明を解釈する方法については混乱しています。似たようなことをする単純で非破壊的なコマンド(拡張のための区切りとして働くスペース)を作成しようとすると、私はそれを取り除くことができないようです。私は、最初のコマンドを試してみましたが、bashでfor
ループで:
$ for f in /usr/{bin/node,lib/node,share/man /*/node.*}; do echo $f; done
は
/
にNode.jsの
とディレクトリ内のいくつかの内容を列挙されています。これは、
rm
の特別な機能ではないことを確認する必要があります。
しかし、私はこのような何かをしようとすると:
それは私が単一行の電子に、各文字を期待echo
の近くに構文エラーになり
$ for f in {a,b c,d e}; echo $f
。
私はいくつかの調査をしましたが、この現象を説明するものは見つかりませんでした。 誰かが最初のコマンドで、bash
はこのコマンドをどのように解釈しましたか教えてください。
p.s. zsh
に 'for
ループテスト'のバージョンが動作しないことがわかりました。本当の 'rm
テスト'を試みたことはありません。怖いです。
\
-escapeあなたのブレース展開の一部であるすべてのスペース必要