2017-11-12 14 views
6

을 통해 경우 전화 또는 다른, 아래 참조 :배쉬는 "화장실 -l"명령 출력은 티

[email protected]:~# ls /usr/bin -lha | tee >(wc -l) >(head) > /dev/null 
total 76M 
drwxr-xr-x 2 root root  20K Nov 11 18:58 . 
drwxr-xr-x 10 root root  4.0K Oct 8 15:31 .. 
-rwxr-xr-x 1 root root  51K Feb 22 2017 [ 
-rwxr-xr-x 1 root root  96 Jan 19 2017 2to3-3.5 
-rwxr-xr-x 1 root root  23K Mar 22 2017 addpart 
lrwxrwxrwx 1 root root  26 May 10 2017 addr2line -> x86_64-linux-gnu- addr2line 
lrwxrwxrwx 1 root root  6 Dec 13 2016 apropos -> whatis 
-rwxr-xr-x 1 root root  15K Sep 13 19:47 apt 
-rwxr-xr-x 1 root root  79K Sep 13 19:47 apt-cache 
137 
[email protected]:~# ls /usr/bin -lha | wc -l 
648 

무엇 내가 빠졌어?

이상한,하지만이 방법을 호출 할 때조차 낯선 출력 가져옵니다

[email protected]:~# ls /usr/bin -lha | tee >(wc) >(wc) > /dev/null 
648 6121 39179 
648 6121 39179 
[email protected]:~# ls /usr/bin -lha | tee >(wc) >(wc) > /dev/null 
648 6121 39179 
648 6121 39179 
[email protected]:~# ls /usr/bin -lha | tee >(wc) >(wc -l) > /dev/null 
648 
[email protected]:~#  648 6121 39179 

가 비동기 적으로 실행 명령처럼 보인다 및 서로 다른 시간에 끝 ... 아니면 할 수 있는지?

+1

예, 프로세스 대체가 비동기 적으로 실행됩니다. [매뉴얼] (https://www.gnu.org/software/)을 참조하십시오. bash/manual/html_node/Process-Substitution.html). –

+0

그래도 문제를 해결하는 방법, 실제 출력이 끝날 때까지 프로그램을 대기 상태로 만드는 방법은 무엇입니까? 아니면 여기에 해결책이 없습니까? –

+0

정확히 달성하기를 원하십니까? 'ls | 머리'와'ls | wc -l'? –

답변

7

간단한 답 :

를 해결하는 방법 :

ls /usr/bin -lha | tee --output-error=exit-nopipe >(wc -l) >(head) > /dev/null 

세부 사항 :

명령 head 그것만큼 충분히를수록 그 작업을 완료 할 수 있습니다 만, 입력의 머리를 인쇄 입력을 기다렸다가 모든 입력을 기다리지 않고 종료합니다.

그럼 head 명령을 "head" 단순으로 대체하십시오.

ls /usr/bin -lha | tee >(wc -l) >(read l; echo $l) > /dev/null

간단한 "head"

파이프 파일이 모든 데이터를 전송 tee 마감 직전에 폐쇄 가져옵니다 원인이 하나의 라인, 다음 종료를 읽습니다.

의심 할 여지없이 간단한 "head"으로 동일한 결과를 얻을 수 있습니다. wc 여전히 잘못된 번호를 인쇄합니다.

문제의 근본 이유는, 당신이 스스로 결론을 내릴 수 있다고 생각 tee의 출력 파일 중 하나가 tee쓰기 오류 안타, 다음 기타 출력 파일에 기록 중지, 조기 폐쇄된다는 점이다.

근본적인 이유를 이해 한 후에는 설명서 페이지의 다음 절을 이해하는 것이 매우 쉽다고 생각합니다.

MODE determines behavior with write errors on the outputs: 
    'warn' diagnose errors writing to any output 

    'warn-nopipe' 
      diagnose errors writing to any output not a pipe 

    'exit' exit on error writing to any output 

    'exit-nopipe' 
      exit on error writing to any output not a pipe 

    The default MODE for the -p option is 'warn-nopipe'. The default operation 
    when --output-error is not specified, is to exit immediately on error writing to 
    a pipe, and diagnose errors writing to non pipe outputs. 

일부 여분의 단어

당신이 당신의 문제가 명령 줄에서 일반 파일로 <(wc -l)을 교체하면 사실

, 당신은 파일 크기가 항상 4096

의 모든 배수 16384 또는 20480을 것입니다 찾을 수 있습니다

4096은 대부분의 UNIX 시스템에서 PIPE_BUF의 값입니다. PIPE_BUF이 무엇인지 아는 경우 파일 크기가 항상 4096의 배수 인 이유를 쉽게 알 수 있습니다.

+0

명령 설명 [here] (https://explainshell.com/explain?cmd=ls+%2Fusr%2Fbin+-lha+%7C+tee+--output-error%3Dexit-nopipe+%3E%28wc+-l%29+ % 3E % 28head % 29 + % 3E + % 2Fdev % 2Fnull) –