2016-06-07 5 views
1

:명명 된 파이프에 쓰는 동안 bash가 닫히는 이유는 무엇입니까? bash는 1에서

$ mkfifo /tmp/pipe 
$ echo 'something' > /tmp/pipe 

은 이제 중단하고 데이터를 읽을 수 있음을 기다립니다. bash는 2 년

:

$ </tmp/pipe 

지금 쉘 (1) 내 단말기가 없어,이 닫혀 멀리 간다.

왜 이런 일이 발생합니까?

은 bash는 설명서에서

명령 대체 $ (고양이 파일)

해당하지만 빠른 $ (< 파일)로 대체 될 수있다이 기록됩니다. 일반 "< 파일은"터미널에 고양이 파일 내용 유사한 방식으로 작동하는 경우

그래서 나는 실험을했다.

$ bash --version | head -1 
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu) 
$ cat /proc/version 
Linux version 3.16.0-71-generic ([email protected]) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)) #92~14.04.1-Ubuntu SMP Thu May 12 23:31:46 UTC 2016 

편집

초기의 의견과 답변을 본 후 나는 설명의 비트를 추가합니다.

다른 명령 줄 구문에 대해 걱정하지 않습니다.

그러나 실제로 내가 쓴 것은 독자 쉘에서 $ < /tmp/pipe 시나리오 작성기 셸이 종료되었지만 리더 셸에서는 $ cat /tmp/pipe 인 경우 작성기 셸이 종료되지 않았습니다. 왜?

본인은 문제의 문구와 본문에서 실제로 그런 문구를 사용하지 않았으며 아마도 다른 질문을 시작해야 할 것입니다. the pipe(7) manual page 가입일

+0

'$ (은'cat file'을 보편적으로 대체하지 않습니다. – chepner

답변

1

는 : 파이프의 판독 단부 참조 모든 파일 디스크립터가 폐쇄 된 경우

, 다음 write(2)SIGPIPE 신호가 호출 프로세스를 위해 생성되도록 할 것이다. 어떻게됩니까

는 독서 쉘이 읽기를 완료하고 파이프의 끝을 닫을 때, 쓰기 쉘이 SIGPIPE 신호를 수신하는 것입니다, 그리고 그 다음 그것을 잡을하지 않는 경우 쉘은 종료됩니다.

+0

나는 그들이 그것을 묻고 있다고 생각하지 않는다. 나는 그들이'cat' 대신에'<'를 사용한다면 왜 출력하지 않는지 묻고 있다고 생각합니다. – 123

+0

@ 123 질문 제목 "Named pipe에 쓰는 동안 bash가 닫히는 이유는 무엇입니까?" 그렇지 않으면 나타냅니다. –

+0

이 경우 명백한 사본이며 하나의 것으로 표시해야합니다. – 123

0

수동 기호로 $variable이 아니고 command prompt으로 연결됩니다.

는 다음과 같은 스크립트를 시도해보십시오

1)

#!/bin/bash 
echo $(< /tmp/pipe); 

2)

#!/bin/bash 
echo $(cat /tmp/pipe); 

모두 제대로 작동합니다.

+0

그는'$ '을 입력하지 않고, 단지 명령 프롬프트로 표시하고 있습니다. – Barmar

+0

예. '$ Daniel

+0

질문과 관련이되는 것은 무엇입니까? 이것이 echo echo/tmp/pipe '도망 간다? – Barmar

0

< /tmp/pipe을 입력하면 현재 셸의 표준 입력을 명명 된 파이프에 대신 연결합니다. bash은 입력에서 계속 읽고 명령으로 읽는 것을 실행하여 작동합니다.

  1. 쉘 1에서 echo something > /tmp/pipe은 쓰기를 위해 파이프를 열고, 문자열을 쓰고, 그런 다음 읽을 때까지 차단합니다. echo이 완료되면 파이프 끝을 닫습니다.
  2. < /tmp/pipe은 읽기 위해 파이프를 열고 쉘 2의 표준 입력에 연결합니다.
  3. 셸 2가 파이프에서 읽고 (명령을 실행하려고 함)
  4. 쉘 1에서 돌아 오면 파이프에서 두 번째 셸 읽기 후에 차단 해제 된 echo이 완료됩니다. 파이프의 쓰기 끝이 닫힙니다.
  5. 파이프의 쓰기 끝이 닫히면 다른 명령을 읽으려고 할 때 쉘 2가 SIGPIPE이되고 종료됩니다.

은 (명령이 파이프로부터 판독 및 원인을 에러를 실행하려고하면 대체 가능성이 쉘 (2)이 종료된다.)

$(< file)

, 다른 한편으로, 명령 치환의 특별한 경우이다 . bash은 그걸 보았을 때 cat 프로세스를 생성하고 출력을 캡처하기보다는 file에서 읽는 것입니다.

+0

Writer 쉘 (1)은 write()를 끝내면 SIGPIPE를 얻습니다.리더 셸 (2)이 종료되지 않습니다. – Rax