
인용하다내 대답tmp
프로세스 교체를 위한 입력과 동일한 파일을 사용 하고 tmp
상위 셸의 동일한 파일에 출력을 쓰고 있습니다. 이로 인해 프로세스 교체에서 읽고 셸에서 쓸 때 중단이 발생합니까?
댓글과 토론 내용을 바탕으로비슷한 게시물찾아보니 갈등은 없는 것 같죠?
grep -xvFf <(cut -d'/' -f1 tmp) ext >> tmp
댓글의 관련 토론:
우아해 보이지만
tmp
동시에 읽고 쓰는 것이 아닌가요? –콰지모도@Quasímodo 아니요, 하위 쉘은 읽기 전용으로 열리고 생각 처리가 완료된 후
tmp
리디렉션이 완료된 다음 쓰기를 위해 쉘이 다시 열립니다(하지만 저는 아직 이에 대한 전문가가 아니기 때문에 100% 알 수는 없습니다). 확인하세요) – α?sнιιgrep
tmp
@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>
출력에 영향을 주지 않고 파일을 자르려면 리디렉션하세요.)