프로세스 대체의 맥락에서 I/O 리디렉션 이해

프로세스 대체의 맥락에서 I/O 리디렉션 이해

GNU bash 버전 4.3.11(1) 릴리스(x86_64-pc-linux-gnu)를 실행합니다.

잘 이해하지 못 하겠어프로세스 교체(ProcSub) I/O 처리 및 관련 속도 문제에 관심이 있는 사용자의 관점에서. ProcSub를 사용하여 스크립트를 작성하고 있어서 파일 설명자 0,1,2에 대한 아이디어가 어느 정도 있지만 그게 전부입니다. 다음과 같은 좋은 글을 읽었습니다.[1]그리고 기타. 예를 들어 위키피디아[2],[삼], 후자는 다음과 같이 말합니다."프로세스 대체는 한 프로세스(또는 프로세스)의 출력(FD 1 및/또는 2)을 다른 프로세스의 stdin(FD 0)에 공급합니다.". 가장 단순한 정의와 단 하나의 프로세스만 있으면 이름이 지정되지 않은 단순한 파이프와 크게 다르지 않은 것처럼 보입니다.

이를 조사하기 위해 teeI/O 관점에서 시작했는데, 이는 그 자체로 흥미롭습니다.
tee먹이를 주는 것이 허용됨"stdin에서 stdout으로, 그리고 인수로 제공된 모든 파일". 그래서:

$ for i in 1 2 3; do (( j=i+10 )); printf "%d\n" $j > file_$i; done
# so each file in file_{1,2,3} contains the numeral in its name + 10.
$ cat file_{1,2,3} | tee file_4
11
12
13
$ cat file_4
11
12
13

분명히, 나는 데이터가 내 화면 ala Matrix를 채우는 것을 보는 데 관심이 없습니다. 따라서 다음과 같은 경우:

1)파이프를 추가하고 shasum출력을 리디렉션했습니다.

$ cat file_{1,2,3} | tee file_4 | shasum -a 256 > file_4.sha256
$ 

위의 정기선 출구조용히, file_4는 이전(위)과 동일하며 file_4.sha256에는 계산된 SHA256 합계가 포함됩니다.

위의 내용은 중간 I/O를 이해하려는 내 문제를 설명하기 위한 예일 뿐입니다. 내 평신도의 결론은 teecmd의 출력이 catfile_4에 저장되고 일반적으로 stdout으로 전송되는 복사본은 실제로 stdout으로 전송되지 않고 shasum.
묻다:이것이 완전히 맞는 말인가요?

2)ProcSub를 사용하여 동일한 작업을 시도했습니다.

$ cat file_{1,2,3} | tee file_4 >(shasum -a 256 > file_4.sha256)
11
12
13
$ 

-> stdout 리디렉션 없이 FD 1로 전송된 것이 있습니까 tee?

묻다:ProcSub가 i/o로 무엇을 하는지, 하지 않는지는 명확하지 않으며(분명히 이 경우 i/o에 영향을 미치지 않습니다) 해당 메커니즘에 대한 설명을 사용할 수 있습니다.

삼)ProcSub를 사용하고 최종 stdout을 file_4로 리디렉션해 보았습니다.

$ cat file_{1,2,3} | tee >(shasum -a 256 > file_4.sha256) > file_4
$ 

이번에는 재치있는 말들이 조용히 참석하고 있습니다.

묻다:따라서 일반적인 질문은 다음과 같습니다. 위의 세 가지 경우(또는 적어도 두 번째와 세 번째 경우)에 대해 i/o는 어떻게 처리됩니까? I/O 용어에는 눈에 띄는 차이점이 있지만(최종 표준 출력만 살펴보세요) 때로는 서로 다른 I/O 프로세스로 인해 디스플레이에 동일한 최종 결과가 나타날 수 있습니다. 텍사스.

답변1

이 관용구는 >(...)단순히 (구어체로) 다음을 의미합니다: "이름파일".

이는 "파일 이름" 역할을 합니다(일종의 모든 것이 즉시 명확해집니다).

$ echo <(date)
/proc/self/fd/11

또는 운영 체제의 다른 번호/이름. 하지만 echo는 다음과 같이 이름을 인쇄합니다.

$ echo ProcSubs11
ProcSubs11

레이블이 ProcSubs11인 파일이 있는 경우 다음을 수행할 수도 있습니다.

$ cat ProcSubs11
contents_of_file_ProcSubs11

당신도 같은 일을 할 수 있습니다:

$ cat <(date)
Fri Jan 15 21:25:18 UTC 2016

차이점은 "프로세스 교체"의 실제 이름이 "보이지 않음"이고 세부 사항이 링크의 모든 고통스러운 세부 사항에 설명된 것처럼 간단한 파일을 읽는 것보다 훨씬 길다는 것입니다.Bash에서 프로세스 교체를 구현하는 방법은 무엇입니까?.


그렇다면 프로젝트를 검토해 보겠습니다.

질문 1

...이름 없는 단순한 파이프와 작동 방식이 다르지 않은 것 같습니다...

unnamed pipe글쎄요, "절차적 대체"는 전적으로 귀하가 제공한 내용 에 기초합니다 .첫 번째 링크상태:

  1. Bash 프로세스는 나중에 생성되는 두 프로세스 간의 통신에 사용되는 명명되지 않은 파이프를 생성합니다.

차이점은 링크에 설명된 ~6단계가 모두 하나의 >(...)관용어 로 축소된다는 것입니다.에 쓰기그리고<(...)다음에서 읽기.

그리고 연결(파이프)에도 파일과 마찬가지로 이름이 있다고 말할 수 있습니다. 단지 이름이 사용자에게 숨겨져 있을 뿐입니다( /proc/self/fd/11처음에 표시된 대로).

실시예 1

1) 파이프를 추가하고 shasum 출력의 리디렉션을 추가했습니다.

$ cat file_{1,2,3} | tee file_4 | shasum -a 256 > file_4.sha256

거기에는 "프로세스 교체"가 없지만 (나중에) tee받은 내용을 stdin파일로 전송(쓰기)한다는 점은 주목할 가치가 있습니다.file_4 그리고에도 동일한 stdin내용을 보냅니다 stdout. (이 경우) shasum이 작성된 파이프에 연결되는 일이 발생합니다.

간단히 말해서 일반인의 관점에서 tee는 및 stdin에 복사됩니다 .file_4shasum

실시예 2

2) ProcSub를 사용하여 동일한 작업을 시도했습니다.

$ cat file_{1,2,3} | tee file_4 >(shasum -a 256 > file_4.sha256)

이 예를 설명하기 위해 위의 설명을 (일반인의 용어로) 재사용합니다:

티셔츠는 , 및 의 stdin세 가지 요소에 복사됩니다 .file_4shasumstdout

왜? . 이것이 >(...)파일 이름이라는 것을 기억하고 이를 한 줄에 넣어 보겠습니다.

$ cat file_{1,2,3} | tee file_4 /proc/self/fd/11

tee는 두 파일 모두에 입력을 제공 file_4하고 shasum("프로세스 대체"를 통해) stdouttee는 tee여전히 기본 위치인 콘솔에 연결되어 있습니다. 이것이 바로 콘솔에 숫자가 표시되는 이유입니다.

이 예를 다음과 정확히 동일하게 만들려면1), 우리는 할 수있어:

$ cat file_{1,2,3} | tee file_4 > /proc/self/fd/11  ### note the added `>`

이는 (예, >및 사이에 공백을 사용해야 합니다.>(

$ cat file_{1,2,3} | tee file_4 > >(shasum -a 256 > file_4.sha256)

이는 tee표준 출력을 "프로세스 교체"로 리디렉션합니다.

질문 3

Q: 일반적인 질문은 다음과 같습니다. I/O는 위의 세 가지 상황을 어떻게 처리합니까?

방금 이 3가지 경우를 설명했다고 생각합니다. 불분명한 경우 댓글을 남겨주세요.

질문 4 (댓글에 질문을 수정하고 추가해주세요)

세 번째 경우 <(...) 구문이 작동하지 않는 이유

(평신도의 관점에서) 삽입 할 수 없기 때문에수 소켓에 수 단자 플러그.

<(...) 관용구는 "프로세스 대체" 내부에서 읽으므로 stdin외부 명령에 삽입해야 하는 "출력"을 제공합니다. 외부 명령이 (유사한) 요소 tee에 연결을 시도하고 있습니다 . stdout따라서 이 쌍은 일치할 수 없습니다.

중요한노트: 이 명령은 cat두 명령 모두 동일한 출력을 제공하므로 프로세스 교체에 적용될 때 일부 세부 정보를 숨깁니다.

$ cat   <(date)
$ cat < <(date)

모든 것이 정확하지만 오해의 소지가 있는 방정식에서 결론을 도출하는 것은 잘못된 것입니다.

답변2

단순한 이름 없는 파이프와 크게 다르지 않게 작동하는 것 같습니다.

요점은 모든 소프트웨어가 stdin에서 읽거나 stdout에 쓰는 것을 지원하는 것은 아니라는 것입니다.

또한 여러 프로세스에서 입력을 원하는 경우 데이터 자체를 확인하지 않고 파이프만으로 프로세스를 구별할 수 없습니다.

{ echo foo; echo bar; } | cat
# vs.
cat <(echo foo) <(echo bar)

분명히 cat나쁜 예입니다. 그러나 awk그것을 갖는 것은 차이를 만들 수 있습니다( FNR대조 NR).

2)

tee file_4 >(shasum -a 256 > file_4.sha256)

stdout 리디렉션 없이 FD 1로 전송된 것이 있습니까 tee?

아니, 왜 있어야 합니까? >(cmd)하다아니요"표준 출력 리디렉션"을 의미합니다! 그래서 리디렉션이 없는 명령이 있습니다. 만일의 경우삼)명령에 리디렉션을 추가하면 출력이 리디렉션됩니다.

이를 사용하면 명령줄을 더 잘 이해할 수 있습니다.

echo tee file_4 >(shasum -a 256 > file_4.sha256)

관련 정보