/etc/init.d/umountfs
シャットダウン中に実行して、ほとんどのファイルシステムをアンマウントします。これには以下が含まれます。
PROTECTED_MOUNTS="$(sed -n ':a;/^[^ ]* \(\/\|\/usr\) /!{H;n;ba};{H;s/.*//;x;s/\n//;p}' /proc/mounts)"
このコマンドは明らかに行のサブセットを選択し、スクリプトから後でアンロードされない/proc/mounts
ように保存されます。
2番目のフィールド(マウントポイント)の行と一致し/
、/usr
次に実行する操作には、意図が何であるかを把握するには、あまりにも多くのエキゾチックなsed機能が含まれます。
これが単に選択/
と/usr
行であれば、他のスクリプトからアンロードされるので意味があります。しかし、そうしませんでした。実際の行で実行すると、/proc/mounts
この行を$PROTECTED_MOUNTS
含むほぼすべての行が含まれます/home
。削除しないと良くなく、/home
このように動作しません。
sedコマンドの作成者は、すべてのブランチとスペースのスケジュール操作で何をしようとしますか?
答え1
一度やりましょう...
これにより、以下を含むすべての行が返されます。最後起こった/
または /usr
。別名これにより、最後に発生した以降のすべての内容が削除されます。
:a;/^[^ ]* \(\/\|\/usr\) /!{H;n;ba};
つまり、完全に含まれていない行または/
2/usr
番目の列(スペースで区切られている)にある場合は、前のH
スペースに追加して分岐行をn
取得し、b
ackをラベルとして繰り返しますa
。
{H;s/.*//;x;s/\n//;p}
/
orのある行に会う場合にのみここに到達します/usr
。次に、(最初の部分のすべてを含む)前のスペースに追加し、パターンスペースを消去し、予約済みH
スペースx
をパターンスペースに変更し、パターンスペースから最初の改行文字を削除してp
印刷します。
/
最後の行を見た後/usr
(そしてその時点まですべてを印刷しました)、最初のセクションを繰り返して、一致しない残りのすべての行を吸収します...しかし決して印刷されません。 2番目の部分。
私はいくつかのテストを行い、結果は私が言うものと一致します。
明らかに、これはで維持される順序に依存します/proc/mounts
。しかし、このリストは以下に基づいています。マウントポイントが生成される順序。だから何をしてもそれを維持しなければならないと思います。そうでなければ、これらの事は壊れるでしょう。私にとっては、すべてが非常に脆弱なようです。