사용하면 echo 1234 >> some-file
문서에 출력이 추가된다고 명시되어 있습니다.
내 생각에는 some-file이 존재하지 않으면 O_CREAT가 새 파일을 생성할 것입니다. 사용되는 경우 >
O_TRUNC는 기존 파일을 자릅니다.
만약에 >>
: 파일이 O_WRONLY(또는 O_RDWR)로 열리고 O_APPEND를 시뮬레이션하여 쓰기 작업을 종료하고 완료하려고 시도합니까? 아니면 파일이 O_APPEND로 열려 커널이 추가가 발생하는지 확인하게 됩니까?
출력 파일이 NFS 마운트 지점에서 나올 때 콘솔 프로세스가 echo에 의해 삽입된 일부 태그를 덮어쓰고 NFS 문서에 따르면 O_APPEND가 서버에서 지원되지 않으므로 클라이언트 커널이 이를 처리해야 하기 때문에 이 질문을 하게 됩니다. 보존 프로세스가 O_APPEND를 사용하고 있는 것 같지만 >>
Linux의 bash에 대해 잘 모르므로 여기에 질문합니다.
답변1
나는 이것을 실행했습니다: strace -o spork.out bash -c "echo 1234 >> some-file"
당신의 문제를 파악하기 위해. 이것이 내가 찾은 것입니다:
open("some-file", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3
명령을 실행하는 디렉터리에 "some-file"이라는 파일이 존재하지 않습니다 echo
.
답변2
이는 Bash에서 수행될 뿐만 아니라 표준에서도 요구됩니다.
추가 출력 리디렉션을 사용하면 단어 확장으로 인해 이름이 지정된 파일이 지정된 파일 설명자에서 출력용으로 열리게 됩니다. 파일은 다음과 같이 열립니다.열려 있는()POSIX.1-2008 시스템 인터페이스 볼륨에 정의된 함수는 O_APPEND 플래그를 사용하여 호출됩니다. 파일이 없으면 생성해야 합니다.
따라서 POSIX 호환 셸에서는 이 작업을 수행해야 합니다. /bin/sh
POSIX가 아닌 Bourne 쉘(Bourne 쉘은 원래 Bourne 쉘이 처음 발명되기 전에 작성됨)과 같은 일부 Unix 시스템에서 O_APPEND
사용 가능한 POSIX 쉘은 일반적으로 다른 경로 위치(예: Solaris' )에 ksh
있습니다 .sh
/usr/xpg4/bin
답변3
소스 코드를 보면 O_APPEND를 사용하고 있습니다. Bash 4.3.30의 경우 make_cmd.c
710-713행:
case r_appending_to: /* >>foo */
case r_append_err_and_out: /* &>> filename */
temp->flags = O_APPEND | O_WRONLY | O_CREAT;
break;
답변4
strace
NFS가 아닌 로컬 파일 시스템에서의 사용법을 살펴보겠습니다 .
$ strace -eopen -- bash -c "echo foo >> /tmp/testfile000" 2>&1 | grep /tmp/testfile000
open("/tmp/testfile000", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3
$ strace -eopen -- bash -c "echo foo > /tmp/testfile000" 2>&1 | grep /tmp/testfile000
open("/tmp/testfile000", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
다른 쉘, 즉 busybox의 dash
, dash
, 및 은 동일한 방식으로 작동합니다.sh
mksh
이 옵션은 시스템 호출 만 추적함을 -e open
나타냅니다 .-e trace=open
open()