하위 쉘의 입력과 상위 쉘의 출력에 동일한 파일 이름을 사용하면 충돌이 발생합니까?

하위 쉘의 입력과 상위 쉘의 출력에 동일한 파일 이름을 사용하면 충돌이 발생합니까?

인용하다내 대답tmp프로세스 교체를 위한 입력과 동일한 파일을 사용 하고 tmp상위 셸의 동일한 파일에 출력을 쓰고 있습니다. 이로 인해 프로세스 교체에서 읽고 셸에서 쓸 때 중단이 발생합니까?

댓글과 토론 내용을 바탕으로비슷한 게시물찾아보니 갈등은 없는 것 같죠?

grep -xvFf <(cut -d'/' -f1 tmp) ext >> tmp

댓글의 관련 토론:

우아해 보이지만 tmp동시에 읽고 쓰는 것이 아닌가요? –콰지모도

@Quasímodo 아니요, 하위 쉘은 읽기 전용으로 열리고 생각 처리가 완료된 후 tmp리디렉션이 완료된 다음 쓰기를 위해 쉘이 다시 열립니다(하지만 저는 아직 이에 대한 전문가가 아니기 때문에 100% 알 수는 없습니다). 확인하세요) – α?sнιιgreptmp

@Quasímodo는 strace grep … grep을 통해 열리고 완료되면 닫히도록 제안하므로 쉘은 grep이 완료된 후 출력을 작성하여 tmp동시에 중단되지 않습니다.

답변1

당신이하고있는 일에 따라 다릅니다.

의 경우 grep -f patterns실제 데이터 파일을 읽기 시작하기 전에 grep파일을 미리 읽어야 합니다 . patterns그렇지 않으면 첫 번째 줄이 일치하는지 알 수 없습니다. 그래서 여기 당신은 안전합니다.

물론 잘림을 사용하여 파일로 리디렉션하는 경우 프로세스 교체 명령이 파일을 읽기 전에 잘릴 가능성이 높습니다. 하지만 아래를 보세요.


일반적으로 말하자면, 추가 모드에서 출력을 리디렉션할 때 출력을 다시 입력으로 반복하는 것에 대해 걱정할 것입니다. GNU grep을 사용해 보세요. 경고를 표시할 만큼 똑똑합니다.

$ seq 99999 > foo.txt
$ grep ^1 foo.txt >> foo.txt 
grep: input file ‘foo.txt’ is also the output

그러나 프로세스 대체를 사용하여 속이면 작동하고 데이터의 일부가 반복적으로 처리됩니다.

$ grep ^1 <(cat foo.txt) >> foo.txt
$ grep -Fx 1933 foo.txt
1933
1933
1933
1933

물론 복사본은 2개만 있어야 합니다 1933. 여행 비용은 변경될 수 있습니다.


잘린 리디렉션의 경우 Linux에서 다음 테스트를 실행했습니다.

echo moi > hello.txt
cat <(cat hello.txt) > hello.txt >&2;

여기서 내부 고양이가 실행되기 전에 리디렉션이 처리되면 hello.txt결과가 출력되지 않습니다. 반면, cat프로세스 내 교체가 먼저 실행되면 파일이 잘리기 전에 파일을 읽을 수 있습니다. 몇 번 반복하세요.

for x in {1..999}; do echo moi > hello.txt; cat <(cat hello.txt) 3> hello.txt; done

내 시스템에 출력이 없습니다유휴 상태인 경우moi, 그러나 단순 바쁜 루프가 동시에 실행되면 출력은 몇 번에서 수십 번입니다. ( 3>출력에 영향을 주지 않고 파일을 자르려면 리디렉션하세요.)

관련 정보