디렉토리에 수천 개의 파일이 있는 광택 파일 시스템에서는 ls
입력할 때마다 파일이 나열되기까지 엄청난 지연이 발생합니다. 파일 목록이 필요한 다른 명령에서도 동일한 일이 발생합니다. 하지만 입력하면 echo *
파일 이름을 빨리 알 수 있습니다.
ls
파일 시스템에 액세스하는 유사한 명령과 비교할 때 기계적/내부적 차이점은 무엇입니까 echo *
? 다음에는 어떻게 되나요?
답변1
ls
파일 이름을 깔끔하게 나열하는 작업이 필요합니다. 또한 이름을 렌더링하는 방법(색상 또는 다른 파일 형식을 나타냄)에 대한 정보가 필요하며 각 디렉터리 항목과 관련된 메타데이터의 세부 정보가 포함될 수 있습니다. 다음은 Cygwin 설치의 예입니다.
cd /bin
ls
[.exe cygpstoedit-0.dll mpost.exe
__pycache__ cygptexenc-1.dll msgtool.exe
a2ping cygraqm-0.dll msxlint.exe
a5toa4 cygraw_r-16.dll mv.exe
acyclic.exe cygraw-16.dll named-rrchecker.exe
addftinfo.exe cygreadline7.dll namei.exe
...
직접적인 관련은 없지만 실험해 보면 ls
가장 긴 파일 이름의 길이에 따라 열 너비가 달라지는 것을 알 수 있습니다. 이를 위해서는 ls
파일 이름이 출력되기 전에 각 파일 이름을 읽고 고려해야 합니다. 최신 버전에서는 ls
"이상한" 파일 이름과 작은따옴표 안에 공백이 포함된 파일 이름이 표시될 수도 있습니다. (개인적으로는 설정을 통해 이 기능을 비활성화합니다 QUOTING_STYLE=literal
.)
echo
그 자체로는 영리한 것은 없지만 쉘은 *
파일 이름의 영숫자 목록으로 확장하고 해당 목록을 직접 단어로 전달합니다 echo
. 이는 다음과 같은 디렉토리입니다 echo
.
cd /bin
echo *
[.exe __pycache__ a2ping a5toa4 acyclic.exe addftinfo.exe addr2line.exe adhocfilelist afm2pl.exe afm2tfm.exe aleph.exe allcm allec allneeded animate apropos ar.exe arara arch.exe arlatex as.exe ascii.exe ash.exe autosp.exe awk axohelp.exe b2sum.exe banner.exe base32.exe...
ls
여러분이 보는 것은 쉘이 깔끔한 목록을 생성하기 위해 수행되는 처리 보다 훨씬 빠르게 파일 이름 목록을 추출한다는 것입니다 . GNU에서는 ls
디스플레이 처리를 비활성화할 수 있습니다 ls -f
. ( man ls
실제로 무엇을 하는지 확인해 보세요.)
답변2
명령을 실행하기 전에 현재 셸은 공백으로 구분된 *
파일 목록(파일에서 읽는 것으로 가정)으로 대체됩니다..
echo
echo
공백 사이의 각 문자 시퀀스는 단어로 처리되며 공백 문자로 구분된 단어 목록이 출력됩니다. 즉, 여러 공백은 단어 구분 기호 하나만으로 처리됩니다. 따라서 파일 이름에 공백이나 특수 문자가 있는 경우 파일의 정확한 이름이 출력에서 변경될 수 있습니다.
ls
.
현재 디렉터리의 파일 목록이 포함된 파일에 액세스 하고 <new line>
문자로 구분된 파일 이름을 인쇄합니다.