디렉토리에 txt 파일이 많이 있습니다.
내가한다면 time wc -l *.txt | head
그것은 걸릴
real 0m0.032s
user 0m0.020s
sys 0m0.008s
내가한다면 time wc -l *.txt | tail
그것은 걸릴
real 0m0.156s
user 0m0.076s
sys 0m0.088s
wc
이는 그것이 머리로 연결되고 있다는 것을 미리 알고 처음 10개의 파일만 계산하여 시간을 절약한다는 의미입니까 ? 즉, 파이프를 인식하고 있습니까? 그리고 이것은 특별한 것입니까 wc
, 아니면 모든 표준/내장 명령에 적용됩니까?
답변1
나는 두 명령 모두에 대해 수행했습니다 strace
. 흥미로운 점은 출력을 파이프할 때 head
시스템 호출이 123개만 있다는 것입니다. 반면에 tail로 파이프하면 245개의 시스템 호출이 발생합니다(*.txt 파일이 더 많으면 그 이상).
케이스: 머리
파이프 연결 시 마지막 몇 줄은 다음과 같습니다 head
.
open("file12.txt", O_RDONLY) = 3
fadvise64(3, 0, 0, POSIX_FADV_SEQUENTIAL) = 0
read(3, "", 16384) = 0
write(1, "0 file12.txt\n", 13) = -1 EPIPE (Broken pipe)
--- SIGPIPE (Broken pipe) @ 0 (0) ---
+++ killed by SIGPIPE +++
wc
12번째 파일의 출력을 쓰려고 하면 오류가 발생합니다 EPIPE
. 그래서 head
11번째 줄을 받고 나간 거죠. head
종료 하면 wc
을 얻습니다 SIGPIPE
. 위의 strace 출력에서 볼 수 있듯이 wc
먼저 해당 파이프(더 이상 읽지 않는 파이프)에 쓰기를 시도하고 head
파이프가 손상되었다는 오류가 발생합니다.
SIGPIPE 신호는 다른 쪽 끝에 연결된 프로세스 없이 파이프에 쓰기를 시도할 때 프로세스로 전송됩니다. -- 에서위키피디아
케이스: 꼬리
로 파이프할 때 tail
위와 같은 것은 없습니다. wc는 tail
전체 시간 동안 연결되어야 하는 파이프에 모든 출력을 쓴 후 정상적으로 종료됩니다 . tail
마지막 10개를 인쇄하려면 모든 줄이 필요합니다. 더 이상 읽을 출력이 없으면 tail
줄을 인쇄하고 정상적으로 종료됩니다.
답변2
차단하지 않는 프로세스의 SIGPIPE
출력이 아무도 읽지 않는 파이프의 쓰기 끝으로 이동하면 종료됩니다.
head
따라서 입력을 닫 자마자 (즉, 종료) wc
모든 작업을 완료하는 것보다 시간이 덜 걸리며 종료됩니다.
답변3
파일을 사라지게 하려면 다음을 수행하십시오.
time wc -l *.txt > tee | tail
하지만 time
.
와 함께 tee command
:
root@debian:/home/mohsen/test# time wc -l *.txt > tee | tail
real 0m0.005s
user 0m0.000s
sys 0m0.000s
없이 tee command
:
root@debian:/home/mohsen/test# time wc -l *.txt | tail
8 f3.txt
7 fi.txt
5 mydata.txt
4 newfile.txt
4 t1.txt
4 t2.txt
5 test.txt
4 text.txt
0 t.txt
49 total
real 0m0.004s
user 0m0.000s
sys 0m0.000s