ls
시도한 디렉토리 ls|cat
에 ls -1
대해 바이트와 동일한 출력을 반환 하는 반면 여러 열로 출력을 반환합니다 . 아직도 나는 ls -1
같은 대답에 파이프가 표시되는 것을 봅니다 ls -1|wc -l
. 선호 할만한 이유가 ls -1
있습니까? 왜 ...|cat
출력 이 변경 ls
됩니까?
답변
ls
출력이 터미널로 전달되는지 테스트합니다. 출력이 터미널로 보내지지 않으면 -1
기본값입니다. (이것은 중 하나에 의해 대체 될 수 있습니다 -C
, -m
또는 -x
옵션.)
따라서 ls
파이프 라인에 사용될 때 다른 옵션으로 재정의하지 않은 경우을 ls
사용 -1
합니다. 이 동작은 POSIX에 필요하기 때문에이를 신뢰할 수 있습니다
POSIX 사양
-1
출력이 터미널로 이동하지 않을 때마다 POSIX가 기본값으로 필요합니다 .
POSIX 사양 :
기본 형식은 한 줄에 하나의 항목을 표준 출력으로 나열하는 것입니다. 터미널 또는 -C, -m 또는 -x 옵션 중 하나가 지정된 경우는 예외입니다. 출력이 터미널에 대한 경우 형식이 구현 정의됩니다.
기본 단일 열 형식을 재정의하는 세 가지 옵션은 다음과 같습니다.
-C
조합 순서에 따라 항목을 열별로 정렬하여 다중 텍스트 열 출력을 씁니다. 텍스트 열 수와 열 구분 문자는 지정되지 않지만 출력 장치의 특성에 맞게 조정해야합니다. 이 옵션은 긴 형식 출력을 비활성화합니다.-m
스트림 출력 형식; 페이지 전체의 경로 이름을 <쉼표> 문자와 <공백> 문자로 구분하여 나열하십시오. 다음 목록 항목을위한 공간이없는 경우 <newline> 문자를 목록 종결 자로 사용하고 구분 기호 시퀀스 뒤에 사용하십시오. 이 옵션은 긴 형식 출력을 비활성화합니다.-x
다중 텍스트 열 출력이 열이 아닌 아래로 정렬 된 항목으로 생성된다는 점을 제외하고는 -C와 동일합니다. 이 옵션은 긴 형식 출력을 비활성화합니다.
GNU 문서
에서 GNU 수동입니다 아닙니다 :
‘-1’
‘–format = single-column’
한 줄에 하나의 파일을 나열하십시오. 표준 출력이 터미널이 아닌 경우 ls의 기본값입니다 . 파일 이름 내에 개행 문자가 직접 출력되지 않도록하려면 -b 및 -q 옵션을 참조하십시오. [공포도 추가]
예
세 개의 파일을 만들어 봅시다 :
$ touch file{1..3}
출력이 터미널로 갈 때 GNU ls
는 다중 열 형식을 사용하도록 선택합니다.
$ ls
file1 file2 file3
출력이 파이프 라인으로 갈 때 POSIX 스펙에서는 단일 열이 기본값이어야합니다.
$ ls | cat
file1
file2
file3
기본 단일 열 동작을 재정의하는 세 가지 예외는 -m
쉼표로 구분되고 -C
열이 정렬되어 있고 -x
열이 정렬되어있는 경우입니다.
$ ls -m | cat
file1, file2, file3
$ ls -C | cat
file1 file2 file3
$ ls -x | cat
file1 file2 file3
답변
-
표준 출력을 배관하면 왜 동작이 변경
ls
됩니까? 그렇게 설계 되었기 때문입니다. POSIX 사양은 말합니다 :기본 형식은 한 줄에 하나의 항목을 표준 출력으로 나열하는 것입니다. 예외는 단말기들 또는 하나의 경우에
-C
,-m
또는-x
옵션이 특정된다. 출력이 터미널에 대한 경우 형식이 구현 정의됩니다.실제로 터미널에 출력 되는 기본 동작 (
-l
또는 같은 옵션으로 지정되지 않은 경우)에 대해 모호-1
하며 GNU Coreutils 설명서에 따르면표준 출력이 터미널 인 경우 출력은 열 (수직 정렬)이며 제어 문자는 물음표로 출력됩니다. 그렇지 않으면 출력이 한 줄에 하나씩 나열되고 제어 문자는 그대로 출력됩니다.
파일로의 출력은 파이프로의 출력과 동일하게 작동한다는 것을 알 수 있습니다. 즉, 마치
-1
지정된 것처럼 줄당 하나의 항목입니다 . - 왜 그렇게 설계 되었습니까? 누군가가 일부 디자인 노트를 찾을 수없는 한 확실하지 않을 수도 있지만 다음과 같이 추측합니다.
ls
터미널에 쓸 때 사람은 출력을보고있을 것으로 예상합니다. 사람들은 필요한 최소 줄 수로 정보를 얻는 것을 선호하므로 물건이 화면을 스크롤하지 않습니다.ls
파이프에 쓸 때 다른 프로그램이 출력을 읽고있을 것으로 예상합니다. 파일 이름에 공백이 포함될 수 있으므로 열을 구문 분석하는 것보다 프로그램이 한 줄에 하나의 값을 갖는 데이터를 읽는 것이 훨씬 쉽습니다.
ls -1
파일이나 파이프에 쓸 때 선호 할만한 이유가 있습니까? 아니.
답변
ls를 파이핑 할 때 ls는 콘솔이 실제로 가지고있는 열의 양을 결정할 수 없습니다 (오른쪽 명령과 무관). 따라서 자체적으로 선택하거나, 즉이 동작이 불안정 하고 이후 버전에서 변경 될 수 있습니다.
대조적으로, ls -1
일반적으로 계산 또는 스크립팅을 목적으로 만들어 졌으므로 동작이 안정적입니다.