ls의 출력에는 개행 문자가 있지만 한 줄에 나타납니다. 왜?

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

답변1

출력을 파이프할 때 ls동작이 다릅니다 .

이 사실이 숨겨져 있습니다정보 문서:

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

이를 시연하려면 다음을 실행해 보세요.

ls

그런 다음

ls | less

이는 파이프 또는 리디렉션 여부에 관계없이 한 줄에 하나의 파일 출력을 보장하려면 다음을 실행해야 함을 의미합니다.

ls -1

( -11위입니다)

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

ls -C

( -C대문자 C입니다)

답변2

귀하의 연구 결과는 구문 분석된 출력이 항상 나쁜 생각인 주된 이유를 강조합니다 ls. Greg의 위키 보기전체 설명.

문제를 거꾸로 생각해 보세요. ls는 때때로 출력 사이에 개행 문자를 인쇄하지만 때로는 그렇지 않은 경우도 있습니다. 이는 스크립트에서 사용하거나 플래그에 의해 강제되는 경우에도 -1마찬가지입니다 . 각 파일 끝에는 개행 문자가 있습니다. 무엇을 가지고각 개행 문자가 새 파일 이름을 나타낸다는 보장은 없습니다.. 실제로 파일 이름 자체에 개행 문자가 포함되어 있으면 ls 출력을 전혀 구문 분석할 수 없습니다. 다음 파일 이름을 고려하십시오.

file1
file2\nfile3
file4

디렉터리에 이 디렉터리가 포함되어 있으면 ls -1다음과 같은 내용이 표시됩니다.

file1
file2
file3
file4

당연히 4개의 파일이 있다고 생각하지 않겠습니까? ls 출력을 구문 분석하는 모든 스크립트에서도 마찬가지입니다. 실제로 세 개의 파일이 있는데 그 중 하나는 이름이 까다롭지만 ls.*의 출력에서는 이를 알아낼 수 없습니다.

* 이 플래그를 사용하고 출력이 중단되었음을 확인하지 않는 한 -l스크립트는 계속 차단됩니다 .

관련 정보