입력 리디렉션이 일관되지 않게 동작합니다.

입력 리디렉션이 일관되지 않게 동작합니다.

실험 목적으로 이름이 지정된 10000010바이트 파일(99010줄, 각각 100줄 연속 a) 을 작성했습니다. big그런 다음 전체 텍스트를 클립보드에 복사 wc하고 실행하여 stdin. 다음으로, 똑같은 효과를 내는 간단한 리디렉션을 만들었습니다. 그러나 이것이 내가 얻는 것입니다:

$ wc[Enter]
[paste 99010 lines of garbage copied directly from `big']
  99010   99010 10000010
$ wc < big
   99010    99010 10000010

다양한 필드 너비에 유의하세요. 내 추측으로는 첫 번째 결과가 인쇄 "%7d %7d %7d"되고 두 번째 결과가 인쇄된다는 것입니다 "%8d %8d %8d".

누군가 이것이 어떻게 가능한지 설명할 수 있습니까? 나는 wc두 번째 실험에 관한 한 입력도 다음에서 나온다는 인상을 받았습니다 stdin(셸이 처리를 처리하므로 내가 입력했다는 사실 < big조차 wc알 수 없으므로 이론적으로는 wc다음을 수행해야 함 ). 같은 일이 두 번이나 있지만 분명히 그렇지 않습니다. 리디렉션에 대해 무엇을 이해하지 못합니까?

편집: 이것이 중요하지 않다고 생각하지만 $ cat big | xclip -selection clipboard데이터를 클립보드에 복사한 다음 그놈 터미널을 마우스 오른쪽 버튼으로 클릭하고 붙여넣었습니다. 누구든지 자신의 컴퓨터에서 이 작업을 시도하고 싶을 경우를 대비해 말이죠.

답변1

GNU coreutils의 wc 구현은 열 너비를 최적화하려고 시도합니다. 일반 파일(표준 입력 또는 이름으로)을 전달하면 각 파일의 모든 디렉토리 항목을 읽어 파일 크기를 파악하고 인쇄할 모든 숫자가 다음의 합보다 작거나 같다는 것을 알고 있습니다. 파일 크기. 일반 파일의 경우 wc는 이에 따라 열 너비를 조정합니다. 입력 파일 중 하나 이상이 일반 파일이 아닌 경우 GNU wc는 기본 너비 7을 사용합니다. (이는 너무 작아서 추가 공간이 많이 생기거나 너무 커서 정렬되지 않은 열이 생길 수 있습니다.) .

관련 정보