Linux에서 ">>"를 사용할 때 bash는 O_APPEND에서 파일을 열 수 있습니까?

Linux에서 ">>"를 사용할 때 bash는 O_APPEND에서 파일을 열 수 있습니까?

사용하면 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에서 수행될 뿐만 아니라 표준에서도 요구됩니다.

단일 Unix 사양에서:

추가 출력 리디렉션을 사용하면 단어 확장으로 인해 이름이 지정된 파일이 지정된 파일 설명자에서 출력용으로 열리게 됩니다. 파일은 다음과 같이 열립니다.열려 있는()POSIX.1-2008 시스템 인터페이스 볼륨에 정의된 함수는 O_APPEND 플래그를 사용하여 호출됩니다. 파일이 없으면 생성해야 합니다.

따라서 POSIX 호환 셸에서는 이 작업을 수행해야 합니다. /bin/shPOSIX가 아닌 Bourne 쉘(Bourne 쉘은 원래 Bourne 쉘이 처음 발명되기 전에 작성됨)과 같은 일부 Unix 시스템에서 O_APPEND사용 가능한 POSIX 쉘은 일반적으로 다른 경로 위치(예: Solaris' )에 ksh있습니다 .sh/usr/xpg4/bin

답변3

소스 코드를 보면 O_APPEND를 사용하고 있습니다. Bash 4.3.30의 경우 make_cmd.c710-713행:

case r_appending_to:                /* >>foo */
case r_append_err_and_out:          /* &>> filename */
  temp->flags = O_APPEND | O_WRONLY | O_CREAT;
  break;

답변4

straceNFS가 아닌 로컬 파일 시스템에서의 사용법을 살펴보겠습니다 .

$ 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, 및 은 동일한 방식으로 작동합니다.shmksh

이 옵션은 시스템 호출 만 추적함을 -e open나타냅니다 .-e trace=openopen()

관련 정보