2017-12-21 5 views
1

나는두 명령의 STDOUT 스트림을 서로 다른 방향으로 리디렉션하는 방법 STDIN?

~$ command1 | command2 | command1 

같은 것을 할 필요가 그리고 세번째는 같은 프로그램의 다른 인스턴스하지만 동일한 프로세스 안된다. 나쁜 영어, 내가 올바르게 설명했는지 확신 할 수 없으므로 다른 의미에서 말하는 것을 말하면서 한 번 더 시도해 봅니다.

다음과 같이 처리 할 것을 기대합니다 :Program1이 인쇄하면 Program1이 인쇄 한 내용을 읽습니다. , Program2는 무언가를 인쇄하고, Program1은 Program2가 인쇄 한 것을 스캔합니다. BASH의 상세한 학습이 트릭을 수행한다면 내 잘못이라고 생각하지만 Google을 통해 적절한 솔루션을 찾지 못했습니다.

+1

아마 https://unix.stackexchange.com/questions/53641/how-to-make-bidirectional-pipe-between-two-programs? – larsks

+0

아마도'command2'가'command1'의 코 프로세스입니다 ... http://wiki.bash-hackers.org/syntax/keywords/coproc –

답변

1

일반적으로 서투른 것으로 간주되는데, 귀하의 질문은 원에서 두 개의 처리 엔티티 (프로세스)에 대해 말하기 때문에별로 의미가 없습니다. 이 상황은 암탉/달걀 상황이며 어디에서 시작했는지 그리고 어떻게 끝나야하는지 묻습니다.

그럼 구체적인 유스 케이스에 대해 좀 더 알려주고 싶다면 어쩌면 다른 수준에서 더 나은 조언을 제공하여 문제를 해결할 수 있습니다.

그러나 조금 더 자유롭게, @ mark-setchell의 의견은 당신이하고 싶어 할지도 모른다고 생각합니다. command2 같은 소리는 command1의 동시 발음입니다. 즉, 병렬로 실행되고 데이터를 수신하고 필요에 따라 데이터를 전달하는 것입니다. bash은 그러한 것을 알고 그것을 지원하지만 널리 사용되지는 않으므로 어디에서나 많은 지원을 기대하지 마십시오.

이 예에서는 아마도 이용 보여 줄에 u하여 x 대체이 라인 읽기 루프를 실행하는 현재 쉘 코 루틴 (coproc)를 생성

coproc SED while read a; do echo "$a" | sed 's/x/u/g'; done 
ls -l 1>&${SED[1]} 
cat 0<&${SED[0]} 
  • 을 다음 출력 다시.
  • 그런 다음 ls -l을 호출하고 실행중인 코 루틴으로 출력을 보냅니다.
  • 마지막 줄은 마침내 기존의 coroutine의 출력을 읽고 stdout으로 출력합니다.

마지막 두 단계는 동시 루틴이 계속 실행되기 때문에 반복적으로 수행 할 수 있습니다.

+0

순수한 CI에서는 C++에서 pthread를 사용하고 싶습니다. . 제 경우에는 운영 체제 자체에서 수행해야합니다. 진짜야? –

+0

질문을 변경하지 마세요 .--) C/C++ 관련 정보가 아니라 셸 관련 자료에 대해 질문했습니다. 물론이 질문과 관련하여 다양한 측면에 대한 후속 질문을 게시 할 수 있습니다. – Alfe

+0

방금 ​​내가이 말을 지적했습니다. C++에서와 같이 2 개의 문자열 (thread1 sscanf-s * S1 및 sprintf-s * S2, thread2 sscanf-s * S2 및 sprintf-s * S1)을 사용하여이 작업을 수행 할 수 있습니다. 나는 단 두 개의 프로그램을 가지고있다. 물론 나는 무한 루프를 피하기 위해 서로를 충분히 이해할 수 있도록 가르 칠 것입니다. COPROC를 목표로 해 주셔서 감사합니다. 주제를 발견하겠습니다. –