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다음 스크립트에서 나중에 언로드되지 않도록 저장됩니다.

두 번째 필드(마운트 지점)의 행과 일치하고 /, /usr다음에 수행하는 작업에는 의도가 무엇인지 파악하기에는 너무 많은 이국적인 sed 기능이 포함됩니다.

이것이 단지 선택 //usr행인 경우 다른 스크립트에서 언로드되므로 의미가 있습니다. 그러나 그렇게 하지 않았습니다. 실제 행에서 실행하면 /proc/mounts이 행을 $PROTECTED_MOUNTS포함하여 거의 모든 행이 포함됩니다 /home. 제거하지 않으면 좋지 않으며 /home이런 식으로 작동하지 않습니다.

sed 명령 작성자는 모든 분기 및 공간 예약 작업으로 무엇을 하려고 할까요?

답변1

한번 해볼게...

그러면 다음을 포함한 모든 행이 반환됩니다.마지막일어난/ 또는 /usr. 일명 이렇게 하면 마지막으로 발생한 이후의 모든 내용이 삭제됩니다.

:a;/^[^ ]* \(\/\|\/usr\) /!{H;n;ba};

즉, 완전히 포함되지 않은 행 /이나 /usr두 번째 열(공백으로 구분됨)에 있는 경우 H이전 공간 에 추가하고 n분기 행을 가져온 다음 back를 label로 반복합니다 a.

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

/or 가 있는 줄을 만날 경우에만 여기에 도달합니다 /usr. 그런 다음 (첫 번째 부분의 모든 것을 포함하는) 이전 공간에 추가하고 H, 패턴 공간을 지우고, x예약된 공간을 패턴 공간으로 변경하고, 패턴 공간에서 첫 번째 개행 문자를 제거하고 p인쇄합니다.

/마지막 줄 을 본 후 /usr(그리고 그 지점까지 모든 것을 인쇄했습니다), 첫 번째 섹션을 반복하고 일치하지 않는 나머지 모든 줄을 흡수합니다... 그러나 결코 인쇄되지 않습니다. 두 번째 부분.

나는 몇 가지 테스트를 했고 결과는 내가 말하는 것과 일치합니다.


분명히 이것은 에서 유지되는 순서에 따라 달라집니다 /proc/mounts. 하지만 이 목록은 다음을 기반으로 한 것입니다.마운트 지점이 생성되는 순서. 그래서 무엇을 하든 그것을 유지해야 한다고 생각합니다. 그렇지 않으면 이런 것들이 깨질 것입니다. 나에게는 모든 것이 매우 취약한 것 같습니다.

관련 정보