"|" 또는 "&"를 사용하면 크기가 다른 결과 파일이 제공되는 이유는 무엇입니까?

"|" 또는 "&"를 사용하면 크기가 다른 결과 파일이 제공되는 이유는 무엇입니까?

내 설명은 다음과 같습니다.

  1. strings *.bin > bin.txt | sort -n bin.txt > logs1.txt

    이것은 나에게 제공되지만 logs1.txt621KB입니다.

  2. strings *.bin > bin.txt & sort -n bin.txt > logs1.txt

    이것은 나에게 제공되지만 logs1.txt0KB가 있습니다.

  3. strings *.bin > bin.txt
    sort -n bin.txt > logs2.txt

    이러한 명령은 586,853KB 파일을 제공합니다 logs2.txt.

크기 는 bin.txt586,853KB입니다. 이는 3개의 옵션만 실행하면 동일한 크기를 얻을 수 있음을 의미합니다 bin.txt. 이유가 무엇인지 궁금합니다.

답변1

이 답변의 일부 세부 사항은 사용자 사용법을 가정합니다 zsh. zsh쉘의 세부 사항은 다음과 같은 이유로 약간 다릅니다.MULTIOS특성.

  1. strings *.bin > bin.txt | sort -n bin.txt > logs1.txt

    그러면 실행되어 strings *.bin결과가 로 리디렉션 됩니다 bin.txt. 동시에 파일이 시작되고 정렬 strings됩니다 . 파이프라인에는 두 명령을 동시에 실행하도록 허용하는 것 외에는 이 파이프라인 내에서 기능이 없습니다.sortbin.txt

    일반적으로 파이프는 왼쪽 명령의 표준 출력을 오른쪽 명령의 표준 입력으로 전송하는 데 사용되지만 두 명령 모두 파일에서 읽기 때문에 파이프는 사용되지 않습니다.

    strings와 는 동시에 시작 되므로 sort전체 파일이 기록되기 전에 파일의 끝을 찾을 가능성이 있습니다 sort. 읽혀지는 데이터의 양은 상당히 무작위입니다.bin.txtstringssort

    파이프의 올바른 사용은 다음과 같습니다.

    strings -- *.bin | sort -n > logs1.txt
    

    여기서는 파일 대신 strings입력에 직접 쓰고 , 파일 대신 출력에서 ​​읽습니다 .sortsortstrings

    파이프의 왼쪽이 충분히 빠르게 데이터를 생성할 수 없으면 파이프의 오른쪽이 일시적으로 차단됩니다. 파이프의 오른쪽이 충분히 빠르게 데이터를 소비할 수 없으면 파이프의 왼쪽이 일시적으로 차단됩니다. 이런 식으로 이 두 유틸리티는동기식sort, 전체 출력을 읽는 것이 보장됩니다 strings.

  2. strings *.bin > bin.txt & sort -n bin.txt > logs1.txt

    두 명령이 동시에 시작 strings되므로 이전 명령과 동일한 문제가 있습니다 . sort프로그램이 &백그라운드에서 시작된 다음 즉시 시작됩니다. 두 유틸리티 모두 서로 독립적으로 쓰거나 읽으며 파일 끝에 도달하기 전에 파일에 쓸 분량을 결정할 수 있습니다.stringssortbin.txtsort

  3. strings *.bin > bin.txt.sort -n bin.txt > logs2.txt

    strings여기에서는 중간 파일의 내용이 정렬되기 전에 중간 파일 쓰기가 완료되도록 허용하여 두 유틸리티를 수동으로 동기화 할 수 있습니다 . 문제 없습니다. 파일에서 전체 출력을 읽을 수 있다는 것이 보장됩니다.bin.txtsortsortstrings

일반화하다: 처음 두 명령은 동기화되지 않고 유용 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에 대한 더 관련성 높은 자료:

관련 정보