ls의 출력에는 줄 바꿈이 있지만 한 줄에 표시됩니다. 왜?


41

쉘과 관련하여 비교적 근본적인 요점을 간과하고 있다고 생각합니다. ls 명령의 출력은 기본적으로 출력을 줄 바꾸기와 분리하지만 셸은 출력을 한 줄에 표시합니다.

누구든지 나에게 이것을 설명 할 수 있습니까? 나는 항상 출력이 공백으로 분리되었다고 가정했지만 이제 출력을 줄 바꿈으로 구분하여 출력이 별도의 줄에 표시 될 것으로 기대합니다.

예:

cpoweradm@debian:~/lpi103-4$ ls text*
text1  text2  text3

od 는 출력이 개행으로 분리됨을 보여줍니다.

cpoweradm@debian:~/lpi103-4$ ls text* | od -c
0000000   t   e   x   t   1  \n   t   e   x   t   2  \n   t   e   x   t
0000020   3  \n
0000022

줄 바꿈이 있으면 왜 출력이 다음과 같이 표시되지 않습니까?

text1 
text2
text3

답변:


44

출력을 파이프 할 때 ls다르게 작동합니다.

이 사실은 정보 문서 에 숨겨져 있습니다 .

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

그것을 증명하기 위해, 달리기를 시도하십시오

ls

그리고

ls | less

즉, 파이프 또는 리디렉션 여부에 관계없이 출력을 한 줄에 하나의 파일로 유지하려면 출력을 실행해야합니다.

ls -1

( -11 번입니다)

또는 다음 ls | less을 실행하여 열에 강제 로 출력 할 수 있습니다.

ls -C

( -C자본 C입니다)


6
@theconnorpower : 그것은 꽤 구체적 ls입니다. 유용하지만 분명히 일관성이없고 놀랍습니다. 그러나 컬러 출력을 생성하는 일부 명령은 파이프 될 때 색상을 제거합니다.
Mikel

5
@theconnorpower : 퀴즈 : Unix의 발명가는 Plan9를 계속 작성했습니다. Plan9에서는 ls항상 한 줄에 하나씩 lc인쇄 하고 항상 열에 인쇄합니다.
Mikel

2
@theconnorpower : 터미널의 크기를 읽고 그에 따라 출력을 조정하는 프로그램도 있습니다. 예를 들어 데비안 dpkg -l에서는 화면의 전체 너비를 사용하지만 파이프에 인쇄하는 경우 터미널의 너비가 80 열이라고 가정합니다 , 필요한 경우 출력을 축약합니다.
Mikel

1
@Mikel Plan9에서 ls / lc의 차이점을 듣는 것이 흥미 롭습니다. 자세한 답변 주셔서 감사합니다.
zod90

1
프로그램이 출력이 파일로 경로 재 지정되는지 또는 쉘로 이동하는지 여부를 어떻게 판별 할 수 있습니까?
user2820379

4

당신의 발견은 결과를 파싱하는 ls것이 항상 나쁜 생각 인 주된 이유를 강조합니다 . 전체 설명 은 Greg의 위키를 참조하십시오 .

문제를 반대로 생각하십시오. ls가 때때로 출력 사이에 줄 바꿈을 인쇄하지 않는 경우가 있습니다. 스크립트에서 사용하거나 -1플래그에 의해 강제 실행되면 사용됩니다 . 각 파일의 끝에 하나의 줄 바꿈. 각 줄 바꿈이 새 파일 이름을 나타내는 것은 아닙니다 . 실제로 파일 이름에 줄 바꿈이 포함되어 있으면 ls의 출력을 절대로 구문 분석 할 수 없습니다. 다음 파일 이름을 고려하십시오.

file1
file2\nfile3
file4

ls -1그 안에 디렉토리가 있으면 다음 과 같은 것이 나타납니다.

file1
file2
file3
file4

자연스럽게 네 개의 파일이 있다고 가정하지 않겠습니까? 따라서 ls의 출력을 구문 분석하는 스크립트도 마찬가지입니다. 실제로 3 개의 파일이 있는데 그 중 하나는 까다로운 이름이지만 ls의 출력에서 ​​알아낼 수는 없습니다. *

* -l플래그 를 사용하지 않고 출력이 중단 되었음을 알지 못하면 스크립트가 여전히 질식합니다.


3
당신이 경우 정말 의 출력을 구문 분석 할 필요 ls-b옵션이 도움이 될 수 있습니다. 개행을 \n등 으로 바꿉니다 .
Mikel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.