Debianの/etc/init.d/umountfsにあるsedコマンドは何をすべきですか?

Debianの/etc/init.d/umountfsにあるsedコマンドは何をすべきですか?

/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取得し、backをラベルとして繰り返しますa

{H;s/.*//;x;s/\n//;p}

/orのある行に会う場合にのみここに到達します/usr。次に、(最初の部分のすべてを含む)前のスペースに追加し、パターンスペースを消去し、予約済みHスペースxをパターンスペースに変更し、パターンスペースから最初の改行文字を削除してp印刷します。

/最後の行を見た後/usr(そしてその時点まですべてを印刷しました)、最初のセクションを繰り返して、一致しない残りのすべての行を吸収します...しかし決して印刷されません。 2番目の部分。

私はいくつかのテストを行い、結果は私が言うものと一致します。


明らかに、これはで維持される順序に依存します/proc/mounts。しかし、このリストは以下に基づいています。マウントポイントが生成される順序。だから何をしてもそれを維持しなければならないと思います。そうでなければ、これらの事は壊れるでしょう。私にとっては、すべてが非常に脆弱なようです。

関連情報