파이프 ls는 ls -1과 동일합니까?


19

ls시도한 디렉토리 ls|catls -1대해 바이트와 ​​동일한 출력을 반환 하는 반면 여러 열로 출력을 반환합니다 . 아직도 나는 ls -1같은 대답에 파이프가 표시되는 것을 봅니다 ls -1|wc -l. 선호 할만한 이유가 ls -1있습니까? 왜 ...|cat출력 이 변경 ls됩니까?


1
파일 이름에는 줄 바꿈이 포함될 수 있으므로 여러 번 계산할 수 있습니다. 대신 실제로 다음과 같이 n=0; for i in .* *; do ((n++)) ; done ; echo $n할 수 있습니다. 또는 : ls -1d ./.* ./* | grep '^\./' | wc -l (파일 이름에 '/'를 포함 할 수 없으므로)
Olivier Dulac

3
ls터미널로의 출력은 일반적으로 기본적으로 컬러 코드를 포함합니다. 비 터미널로 출력하는 경우 기본적으로 색상이 비활성화되어 있습니다. GNU에서는 이것이 --color={always,auto,never}IIRC입니다. 색상이 하나만 포함되고 다른 색상은 포함되지 않으면 출력은 화면에서 동일하게 나타날 수 있지만 바이트와 동일하지 않습니다 (컬러 코드는 ls 출력의 일부를 형성 함).
CVn

@ MichaelKjörling 나는 그것을 대답으로 써야한다고 생각합니다.
200_success

@ MichaelKjörling 그것은 내가 고려하지 않은 흥미로운 것입니다. 색상 및 열 출력 등에 대한 터미널 옵션을 기억하지 않고도 터미널에 출력하는 것처럼 항상 파이프하는 일반적인 방법이 있습니까?
rubystallion

@rubystallion 그것은 좋은 별도의 질문처럼 들립니다.
CVn

답변:


26

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

하지만 인용은 필요한 것을 나타낸다 : "출력 단자로 전환 될 때 POSIX는 기본 -1 요구" -1기본으로 제외 출력 단자 (또는 다른 상태)로 이행 한 경우
muru

@muru 감사합니다. 답변이 업데이트되었습니다.
John1024

모든 구름에는 은색 안감이 있습니다. 내 게시물이 게시되기 전에 귀하의 답변이 수락되었으므로 펑키 피자 모자를 받았습니다!
G-남자 '는 분석 재개 모니카'말한다

@ G-Man 아주 좋아. 그리고, 잘 생긴 모자입니다!
John1024

9
  • 표준 출력을 배관하면 왜 동작이 변경 ls됩니까? 그렇게 설계 되었기 때문입니다. POSIX 사양은 말합니다 :

    기본 형식은 한 줄에 하나의 항목을 표준 출력으로 나열하는 것입니다. 예외는 단말기들 또는 하나의 경우에 -C, -m또는 -x옵션이 특정된다. 출력이 터미널에 대한 경우 형식이 구현 정의됩니다.

    실제로 터미널에 출력 되는 기본 동작 ( -l또는 같은 옵션으로 지정되지 않은 경우)에 대해 모호 -1하며 GNU Coreutils 설명서에 따르면

    표준 출력이 터미널 인 경우 출력은 열 (수직 정렬)이며 제어 문자는 물음표로 출력됩니다. 그렇지 않으면 출력이 한 줄에 하나씩 나열되고 제어 문자는 그대로 출력됩니다.

    파일로의 출력은 파이프로의 출력과 동일하게 작동한다는 것을 알 수 있습니다. 즉, 마치 -1지정된 것처럼 줄당 하나의 항목입니다 .

  • 왜 그렇게 설계 되었습니까? 누군가가 일부 디자인 노트를 찾을 수없는 한 확실하지 않을 수도 있지만 다음과 같이 추측합니다.
    • ls터미널에 쓸 때 사람은 출력을보고있을 것으로 예상합니다. 사람들은 필요한 최소 줄 수로 정보를 얻는 것을 선호하므로 물건이 화면을 스크롤하지 않습니다.
    • ls파이프에 쓸 때 다른 프로그램이 출력을 읽고있을 것으로 예상합니다. 파일 이름에 공백이 포함될 수 있으므로 열을 구문 분석하는 것보다 프로그램이 한 줄에 하나의 값을 갖는 데이터를 읽는 것이 훨씬 쉽습니다.
  • ls -1 파일이나 파이프에 쓸 때 선호 할만한 이유가 있습니까? 아니.

-4

ls를 파이핑 할 때 ls는 콘솔이 실제로 가지고있는 열의 양을 결정할 수 없습니다 (오른쪽 명령과 무관). 따라서 자체적으로 선택하거나, 즉이 동작이 불안정 하고 이후 버전에서 변경 될 수 있습니다.

대조적으로, ls -1일반적으로 계산 또는 스크립팅을 목적으로 만들어 졌으므로 동작이 안정적입니다.


9
다른 답변에 따르면 POSIX에는이 동작이 필요하므로 불안정하다고 부르는 것은 잘못되었습니다.
모니카 아프게 중지
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.