echo `ls -l`에 개행 문자가 없는 이유는 무엇입니까? [복사]

echo `ls -l`에 개행 문자가 없는 이유는 무엇입니까? [복사]

WSL(Linux용 Windows 하위 시스템)을 실행 중이고 ls -l터미널에서 함수를 사용하면 새 줄이 인쇄됩니다. 즉, 각 파일이 새 줄에 표시됩니다. 예를 들면 다음과 같습니다.

total 12K
drwxrwxrwx 1 user user 4.0K Apr  4 23:28 .
drwxr-xr-x 1 user user 4.0K Apr  4 23:28 ..
-rw-rw-rw- 1 user user    0 Mar 28 01:03 a1.file
-rw-rw-rw- 1 user user 4.5K Mar 23 16:27 books.xml
-rw-rw-rw- 1 user user    0 Mar 13 00:19 file1
-rw-rw-rw- 1 user user  513 Mar 13 00:19 file2.txt
-rw-rw-rw- 1 user user 2.8K Mar 13 12:42 file3.txt
-rw-rw-rw- 1 user user  405 Apr  4 23:26 ls_l.txt
-rw-rw-rw- 1 user user    0 Apr  4 23:28 ls_l2.txt
-rw-rw-rw- 1 user user   89 Mar 13 00:18 pattern
-rw-rw-rw- 1 user user   86 Mar 28 01:41 somefile.file

그러나 이것을 사용하면 echo `ls -l` > file1.txt평소와 동일 ls -l하지만 모두 한 줄에 있으며 각 줄은 새 줄 대신 공백으로 구분됩니다. 다음과 같습니다.

total 12K drwxrwxrwx 1 user user 4.0K Mar 27 22:45 . drwxr-xr-x 1 user user 4.0K Mar 27 22:45 .. -rw-rw-rw- 1 user user 4.5K Mar 23 16:27 books.xml -rw-rw-rw- 1 user user 0 Mar 13 00:19 file1 -rw-rw-rw- 1 user user 513 Mar 13 00:19 file2.txt -rw-rw-rw- 1 user user 2.8K Mar 13 12:42 file3.txt -rw-rw-rw- 1 user user 403 Mar 27 22:45 ls_l.txt -rw-rw-rw- 1 user user 89 Mar 13 00:18 pattern

다음과 같은 관련 별칭이 있습니다.

alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls -lah'

답변1

인용하다!!

를 실행하면 ls -l예, 보고한 대로 개행 문자가 생성됩니다. 그러나 이렇게 하면 echo `ls -l` ,개행 문자가 표시되지 않습니다. 시도 해봐.

그 이유는 `...`구문이 명령 확장이고 대부분의 확장(다른 것 중에서)이 쉘 분할(인용되지 않은 경우)의 영향을 받기 때문입니다. 쉘 분할은 IFS기본적으로 가 포함된 변수에서 모든 문자를 제거합니다 <space><tab><newline>. 모든 줄 바꿈은 ls -l제거되고 문자열은 이 시점에서 분할됩니다. 후자는 echo각 분할을 연결하고 공백으로 구분합니다.

그렇습니다. 오래된 것과 옳은 것, 그리고 새로운 것이 항상 선호됩니다.

echo `ls -l`
echo $(ls -l)

IFS가 기본값인 경우 현재 디렉터리의 파일은 개행 없이 문자열로 나열됩니다.

문자열을 파일로 리디렉션하면 예상대로 문자열이 파일에 기록됩니다.

echo $(ls -l) > file

줄 바꿈을 유지하려면 확장자를 인용하십시오.

echo "$(ls -l)"

또는 더 이상 사용되지 않는 다음을 사용하지 마세요 `...`.

echo "`ls -l`"

파일로 출력을 얻으려면 파일로 리디렉션하면 됩니다.

echo "$(ls -l)" > file

관련 정보