내 설명은 다음과 같습니다.
strings *.bin > bin.txt | sort -n bin.txt > logs1.txt
이것은 나에게 제공되지만
logs1.txt
621KB입니다.strings *.bin > bin.txt & sort -n bin.txt > logs1.txt
이것은 나에게 제공되지만
logs1.txt
0KB가 있습니다.strings *.bin > bin.txt
sort -n bin.txt > logs2.txt
이러한 명령은 586,853KB 파일을 제공합니다
logs2.txt
.
크기 는 bin.txt
586,853KB입니다. 이는 3개의 옵션만 실행하면 동일한 크기를 얻을 수 있음을 의미합니다 bin.txt
. 이유가 무엇인지 궁금합니다.
답변1
이 답변의 일부 세부 사항은 사용자 사용법을 가정합니다 zsh
. zsh
쉘의 세부 사항은 다음과 같은 이유로 약간 다릅니다.그 MULTIOS
특성.
strings *.bin > bin.txt | sort -n bin.txt > logs1.txt
그러면 실행되어
strings *.bin
결과가 로 리디렉션 됩니다bin.txt
. 동시에 파일이 시작되고 정렬strings
됩니다 . 파이프라인에는 두 명령을 동시에 실행하도록 허용하는 것 외에는 이 파이프라인 내에서 기능이 없습니다.sort
bin.txt
일반적으로 파이프는 왼쪽 명령의 표준 출력을 오른쪽 명령의 표준 입력으로 전송하는 데 사용되지만 두 명령 모두 파일에서 읽기 때문에 파이프는 사용되지 않습니다.
strings
와 는 동시에 시작 되므로sort
전체 파일이 기록되기 전에 파일의 끝을 찾을 가능성이 있습니다sort
. 읽혀지는 데이터의 양은 상당히 무작위입니다.bin.txt
strings
sort
파이프의 올바른 사용은 다음과 같습니다.
strings -- *.bin | sort -n > logs1.txt
여기서는 파일 대신
strings
입력에 직접 쓰고 , 파일 대신 출력에서 읽습니다 .sort
sort
strings
파이프의 왼쪽이 충분히 빠르게 데이터를 생성할 수 없으면 파이프의 오른쪽이 일시적으로 차단됩니다. 파이프의 오른쪽이 충분히 빠르게 데이터를 소비할 수 없으면 파이프의 왼쪽이 일시적으로 차단됩니다. 이런 식으로 이 두 유틸리티는동기식
sort
, 전체 출력을 읽는 것이 보장됩니다strings
.strings *.bin > bin.txt & sort -n bin.txt > logs1.txt
두 명령이 동시에 시작
strings
되므로 이전 명령과 동일한 문제가 있습니다 .sort
프로그램이&
백그라운드에서 시작된 다음 즉시 시작됩니다. 두 유틸리티 모두 서로 독립적으로 쓰거나 읽으며 파일 끝에 도달하기 전에 파일에 쓸 분량을 결정할 수 있습니다.strings
sort
bin.txt
sort
strings *.bin > bin.txt
.sort -n bin.txt > logs2.txt
strings
여기에서는 중간 파일의 내용이 정렬되기 전에 중간 파일 쓰기가 완료되도록 허용하여 두 유틸리티를 수동으로 동기화 할 수 있습니다 . 문제 없습니다. 파일에서 전체 출력을 읽을 수 있다는 것이 보장됩니다.bin.txt
sort
sort
strings
일반화하다: 처음 두 명령은 동기화되지 않고 유용 strings
하지 sort
않습니다. by를 쓴 것은 strings
를 읽는 것과 아무런 관련이 없습니다 sort
. 이는 sort
모든 데이터가 기록되기 전에 중간 파일의 끝을 찾을 수 있음을 의미합니다. strings
이는 결국 불완전한 최종 결과로 끝날 수 있음을 의미합니다. 불완전한 결과에 포함되는 데이터의 양은 기회에 따라 다릅니다.
두 유틸리티가 동시에 시작된다는 사실은 쉘이 파일을 자르고 시작하기 전에 sort
기존 파일을 bin.txt
끝까지 읽을 수 있음을 의미합니다 strings
.
해결책: 세 번째 예와 같이 먼저 모든 데이터를 중간 파일에 쓴 다음 중간 파일에서 읽습니다. 또는 위에서 제안한 것처럼 두 유틸리티가 파이프를 사용하여 두 유틸리티 간에 직접 데이터를 통신하도록 허용합니다.
strings -- *.bin | sort -n > logs1.txt
strings
또는 나중에 참조할 수 있도록 정렬되지 않은 출력의 복사본을 보관하세요 .
strings -- *.bin | tee bin.txt | sort -n > logs1.txt
U&L에 대한 더 관련성 높은 자료: