bash: 리디렉션 및 파이프 순서에 대한 설명

bash: 리디렉션 및 파이프 순서에 대한 설명

Bash를 더 자세히 이해하기 위해 Bash의 기능 중 일부를 복제해 보았습니다. 이제 리디렉션 및 파이프 기능을 구현하고 있습니다. 이러한 개념을 더 자세히 이해하려면 설명서(리디렉션그리고관로), 저는 몇 가지 특수한 사례를 시험해 본 결과 이해하기 어려운 결과를 얻었습니다.

bash-3.2$ echo test > file | tr -d t < file | wc > file ; cat file
       0       0       0

나는 이 명령의 출력이 이라고 예상했지만 1 1 3결과는 입니다 0 0 0. zsh에서 동일한 명령을 시도했는데 출력이 예상한 대로였기 때문에 내 가정 중 일부가 bash에 대해 잘못된 것 같습니다. 쉽게 참조할 수 있도록 제공된 명령을 다음과 같이 처리하겠습니다 cmd1 | cmd2 | cmd. 명령이 실행될 때 발생하는 상황은 다음과 같습니다.

  1. 표준 출력~의지침 1로 리디렉션되다표준 입력~의지침 2.
  2. 표준 출력~의지침 2로 리디렉션되다표준 입력~의명령 3.
  3. 지침 1실행됩니다:
    1. 문서생성되었거나 잘렸습니다.
    2. 표준 출력echo test로 리디렉션되다문서.
    3. 이것에코명령이 실행되고 "test"가 다음 위치에 저장됩니다.문서.
  4. 지침 2실행됩니다:
    1. 표준 입력tr -d t로 리디렉션되다문서.
    2. 이것명령이 실행되고 "test"가 읽힙니다.문서"es"가 되어 다음으로 출력됩니다.명령 3.
  5. 명령 3실행됩니다:
    1. 문서잘렸습니다.
    2. 표준 출력wc로 리디렉션되다문서.
    3. 이것화장실명령은 "es"를 입력으로 실행되고 "1 1 3"이 다음 위치에 저장됩니다.문서.

분명히 내 가정 중 일부는 잘못되었으며 이를 수정해 주시면 매우 감사하겠습니다.

또한 다음과 같은 다른 명령도 시도했습니다.

bash-3.2$ echo test > file | tr -d t < file | wc >> file ; cat file
test
       1       1       3
bash-3.2$ echo test > file | tr -d t < file | wc > file2 ; cat file ; cat file2
test
       1       1       3

이러한 테스트를 통해 나는 작업이 실행되는 순서나 심지어 잘림이 발생하는 순간에도 내 가정이 틀릴 수 있다고 믿게 되었습니다. 그것이 무엇이든, 설명이나 추가 도움을 주시면 감사하겠습니다.

답변1

파이프의 명령은 동시에 실행되므로 동일한 파일에서 읽고 쓰는 것은 프로세스 예약 방법에 따라 달라집니다.

특히 4.2단계에서는 a) 왼쪽이 아직 아무 것도 쓰지 않았을 수 있고 b) 쓰기 중 리디렉션으로 인해 파일이 잘렸을 수 있기 tr때문에 읽기를 시작할 때 파일에 데이터가 포함되어 있다는 보장이 없습니다 .echowc > fileecho

파일로/에서 리디렉션하면 파이프를 덮어쓰기 때문에 왜 첫 번째 파이프를 사용하는지 잘 모르겠습니다. 당신이 거기서 하는 일은 다음과 관련이 있습니다

echo test > file & tr -d t < file | wc > file; wait; cat file

일반적으로 여전히 동일한 레이스가 모두 포함되어 있기 때문에 그다지 나아지지는 않지만 적어도 혼란스러운 파이프라인 운영자가 없습니다.

Zsh는 multios여러 출력 리디렉션을 인쇄할 수 있다는 점에서 다릅니다.모두대상 및 읽을 수 있는 여러 입력 리디렉션모두원천. 표준 쉘과 같은 마지막 쉘이 아닌.

관련 정보