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

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

ls내가 시도한 디렉토리와 ls|cat동일한 바이트 출력을 반환하면서 여러 열의 출력을 반환합니다. ls -1여전히 ls -1와 같은 답변이 표시됩니다 ls -1|wc -l. 선택할 이유가 있나요 ls -1? ...|cat출력이 변경되는 이유는 무엇입니까 ls?

답변1

ls출력이 터미널로 전송되는지 테스트합니다. 출력이 터미널로 전송되지 않는 경우 이것이 -1기본 출력 입니다. (이는 , 또는 옵션 중 하나로 재정의될 수 -C있습니다 -m. -x)

따라서 ls파이프라인에서 사용하고 다른 옵션으로 재정의하지 않는 경우 ls.-1POSIX에서는 이를 요구하므로 이 동작을 신뢰할 수 있습니다.

POSIX 사양

출력이 터미널로 전송되지 않으면 POSIX에는 -1기본값이 필요합니다.

POSIX 사양:

기본 형식은 터미널을 제외하고 또는 -C, -m 또는 -x 옵션 중 하나가 지정된 경우를 제외하고 한 줄에 하나의 항목을 표준 출력에 나열하는 것입니다. 터미널로 출력하는 경우 형식은 구현에 따라 정의됩니다.

기본 단일 열 형식을 재정의하는 세 가지 옵션은 다음과 같습니다.

-C는
항목이 데이터 정렬 순서에 따라 열별로 정렬되는 다중 텍스트 열 출력을 작성합니다. 텍스트 열 수와 열 구분 문자는 지정되지 않지만 출력 장치의 특성에 맞게 조정되어야 합니다. 이 옵션은 긴 형식 출력을 비활성화합니다.

-m
스트리밍 출력 형식; 페이지의 경로 이름을 <쉼표> 문자와 <공백> 문자로 구분하여 나열합니다. 다음 목록 항목을 위한 줄에 공간이 없을 때 구분 기호 시퀀스 뒤에 <newline> 문자를 목록 종결자로 사용합니다. 이 옵션은 긴 형식 출력을 비활성화합니다.


-x 다중 텍스트 열 출력이 아래가 아닌 여러 열에 걸쳐 정렬된 항목에서 생성된다는 점을 제외하면 -C와 동일합니다 . 이 옵션은 긴 형식 출력을 비활성화합니다.

GNU 문서

~에서GNU ls 매뉴얼:

'-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

답변2

  • 파이핑 stdout이 동작을 변경하는 이유는 무엇입니까 ls? 왜냐면 그렇게 설계되었기 때문이죠. 이것POSIX 사양설명하다:

    기본 형식은 표준 출력에 한 줄에 하나의 항목을 나열하는 것입니다. 단, 터미널인 경우는 다음 중 하나입니다.-C,-m, 또는-x옵션이 지정됩니다. 터미널로 출력하는 경우 형식은 구현에 따라 정의됩니다.

    -l이는 실제로 터미널 출력의 기본 동작에 대해 -1모호합니다 ( 또는 같은 옵션으로 지정되지 않은 경우).GNU Coreutils 문서설명하다

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

    따라서 파일에 대한 출력이 파이프에 대한 출력과 동일하게 동작한다는 것을 알 수 있습니다. 즉, -1지정된 것처럼 한 줄에 항목이 하나씩 있습니다.

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

답변3

ls를 파이핑할 때 ls는 콘솔에 실제로 몇 개의 열이 있는지 확인할 방법이 없습니다(오른쪽 명령에 관계없이). 따라서 ls는 자신의 선택에 따라 이 작업을 수행합니다. 즉, 동작은 다음과 같습니다.불안정한향후 릴리스에서는 변경될 수 있습니다.

이에 비해 ls -1일반적인 계산이나 스크립팅 목적으로 생성되었으므로 동작이 안정적입니다.

관련 정보