디렉터리에 많은 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
의 strace 출력에 표시된 대로 먼저 파이프에 쓰려고 시도하고( 더 이상 읽지 않음) 손상된 파이프 오류를 수신합니다 wc
.SIGPIPE
wc
head
프로세스가 다른 쪽 프로세스에 연결되지 않은 파이프에 쓰기를 시도하면 SIGPIPE 신호가 프로세스로 전송됩니다. - 에서위키피디아
케이스: 꼬리
로 파이프되면 tail
위와 유사한 내용이 없습니다. wc는 항상 연결되어야 하는 파이프에 모든 출력을 쓴 tail
후 정상적으로 종료됩니다 . tail
마지막 10줄을 인쇄하려면 모든 줄이 필요합니다. 또한 읽을 출력이 더 이상 없으면 tail
줄을 인쇄하고 정상적으로 종료합니다.
답변2
비차단 프로세스의 출력이 SIGPIPE
아무도 읽지 않는 파이프의 쓰기 끝에 도달하면 프로세스가 종료됩니다.
head
따라서 입력이 닫히면(즉, 종료되면) 즉시 종료되므로 wc
모든 작업을 완료하는 것보다 시간이 덜 걸립니다.
답변3
다음을 수행하여 파일을 사라지게 할 수 있습니다.
time wc -l *.txt > tee | tail
그러나 tee 명령에 약간의 시간을 추가했습니다 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