빈 디렉토리에서 시작합니다.
$ touch aFile
$ ls
aFile
그런 다음 ls
두 개의 인수 중 하나가이 디렉토리에 없습니다. 두 출력 스트림을 모두 output
. >>
동시에 쓰는 것을 피하기 위해 사용 합니다.
$ ls aFile not_exist >>output 2>>output
$ cat output
ls: cannot access 'not_exist': No such file or directory
aFile
작동하는 것 같습니다. 이 접근 방식에 위험이 있습니까?
아니요, 표준만큼 안전하지 않습니다 >>bar 2>&1
.
글을 쓸 때
foo >>bar 2>>bar
를 사용하여 bar
파일을 두 번 열고 O_APPEND
완전히 독립적 인 파일 객체 [1]를 생성하고 각각 고유 한 상태 (포인터, 열기 모드 등)를 사용합니다.
이것은 2>&1
단순히 dup(2)
시스템 호출을 호출하는 것과는 매우 다르며 동일한 파일 객체에 대해 stderr 및 stdout 별칭을 교환 할 수 있도록합니다.
이제 문제가 있습니다.
O_APPEND
둘 이상의 프로세스가 한 번에 파일에 데이터를 추가하면 NFS 파일 시스템의 파일이 손상 될 수 있습니다. 이는 NFS가 파일에 추가를 지원하지 않기 때문에 클라이언트 커널이이를 시뮬레이션해야하므로 경쟁 조건 없이는 수행 할 수 없습니다.
당신은 일반적으로 같은 파일의 확률에 의지 할 수 bar
있는 foo >>bar 2>&1
매우 낮은 것으로 두 개의 별도의 장소에서 같은 시간에 기록된다. 그러나 >>bar 2>>bar
당신은 이유없이 그것을 수십 배 증가 시켰습니다.
[1] POSIX 용어의 "파일 설명 열기".
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다