sed
임시 파일을 만들고 출력을 해당 파일에 쓴 다음 임시 파일 이름을 원본의 맨 위로 바꿉니다.
다음을 사용하여 어떤 일이 발생하는지 볼 수 있습니다 strace
.
$ strace -e trace=file sed -i -e '' a
execve("/usr/bin/sed", ["sed", "-i", "-e", "", "a"], [/* 34 vars */]) = 0
<...trimmed...>
open("a", O_RDONLY) = 3
open("./sedxvhRY8", O_RDWR|O_CREAT|O_EXCL, 0600) = 4
rename("./sedxvhRY8", "a") = 0
+++ exited with 0 +++
이렇게 sed
하면 모든 파일 작업이 기록됩니다. 새 파일을 (안전하게 O_CREAT|O_EXCL
) 작성하고 데이터를 쓴 다음 원래 파일의 맨 위로 다시 이동합니다 a
.
sed -i
백업에 사용할 접미사를 수락하고이 경우 원본의 이름을 바꾸지 않고 원본을 먼저 이동시킵니다. 이 주장은 대부분의 BSD에서 필수적입니다 sed
. 이 경우 디렉토리에 올바른 이름의 파일이 전혀없는 짧은 시간이 있습니다.
perl
최신 버전에서는 입력 파일을 연 다음 삭제하고 동일한 이름의 새 파일을 만듭니다.
open("a", O_RDONLY) = 3
unlink("a") = 0
open("a", O_WRONLY|O_CREAT|O_EXCL, 0600) = 4
unlink
이미 열려있는 파일 을 삭제 ( )하면 핸들을 유지하는 한 파일에 대한 액세스 권한이 유지되므로 삭제 된 파일에서 데이터를 계속 읽을 수 있습니다. 이런 식 perl
으로 임시 파일이 아닌 출력 파일에 직접 씁니다. 추가 파일이 생성되지 않지만 프로세스 중에 파일을 읽으면 sed
의 접근 방식 과 달리 부분 내용 이 표시됩니다. 올바른 이름을 가진 파일이없는 짧은 시간도 있습니다.이 파일은 끝이 아닌 프로세스의 시작 부분에 있습니다 (와 같이 sed -i .bak
).
모두 sed
와 perl
것입니다 :
- 기호 링크를 일반 파일로 바꾸십시오.
- 하드 링크를 끊습니다.
- 가능하면 그룹 소유권을 유지하십시오.
- 기본 그룹
setgid
이 아니거나 루트가 아닌 그룹이 소유 한 경우 기본 그룹 (또는 해당 디렉토리에 비트 가있는 경우 상위 디렉토리 그룹)으로 파일을 작성하십시오 .
- 루트 인 경우 파일 소유권을 유지하십시오.
- 기본 권한을 유지하십시오.
- 결과 그룹이 시작한 그룹과 동일한 경우 보존
setuid
및 setgrp
비트
- 끈적 끈적한 비트를 유지하십시오.
- xattrs를 보존 하지 마십시오.
sed
의지:
- ACL 유지 (Linux의 경우 다른 사람에 대해서는 모른다) .
perl
의지:
위의 내용은 GNU 기반 Linux sed
및 Mac OS X (FreeBSD 파생)에서 적용 sed
됩니다.