ls *
와 명령을 입력하면 echo *
결과에 상당한 차이가 있음을 알 수 있습니다. 전자는 재귀적으로 포함하고, 후자는 하위 디렉터리의 파일을 완전히 제외합니다. 경로 이름 확장에 대해 다르게 동작합니까?
답변1
ls
매개변수로 전달되면 기본적으로 디렉터리의 내용이 나열됩니다. 이를 *
쉘에 전달하면 ,너의 껍질*
현재 작업 디렉터리의 모든 파일과 디렉터리로 확장한 다음 ls
해당 매개변수를 가져와 처리합니다. 결과적으로 지정된 디렉터리의 내용과 현재 작업 디렉터리의 파일이 나열됩니다.
echo
쉘 확장 의 경우 *
echo는 인수로 전달된 내용만 인쇄하므로 디렉터리 내용을 가져올 수 없습니다.
ls
디렉토리의 내용이 표시되지 않도록 지시하는 데 사용할 수 있습니다 ls -d *
.
이 설정을 고려하면:
$ mkdir dir{1,2}
$ touch file{1..3} dir{1,2}/morefiles{1..5}
$ ls
dir1 dir2 file1 file2 file3
*
셸(bash)에 전달되어 bash가 *
로 확장됩니다 dir1 dir2 file1 file2 file3
. echo
with 를 사용 *
하면 echo
셸의 확장된 내용이 표시됩니다 *
.
$ echo *
dir1 dir2 file1 file2 file3
그러나 기본적으로 지정된 디렉터리 인수는 ls
나열된 디렉터리의 내용을 확장합니다.
$ ls *
file1 file2 file3
dir1:
morefiles1 morefiles2 morefiles3 morefiles4 morefiles5
dir2:
morefiles1 morefiles2 morefiles3 morefiles4 morefiles5
$
*
on을 제거하거나 ls
(예제 디렉터리 구조를 만든 후 표시됨) 내 답변에서 언급한 대로 다음을 사용할 수 있습니다 ls -d *
.
$ ls -d *
dir1 dir2 file1 file2 file3
ls
그러면 및의 내용 표시가 중지됩니다 .dir1/
dir2/
답변2
DravSloan의 탁월한 답변을 명확히하기 위해 차이가 없습니다. *
두 경우 모두 쉘에 의해 확장되며 두 경우 모두 정확히 동일한 것으로 확장됩니다. 차이점은 그들의 주장을 다루는 방식 echo
과 ls
처리 에 있습니다.
echo
제공한 각 매개변수만 인쇄됩니다. ls
~ 할 것이다list directory contents
설명서대로 입니다. 따라서 두 경우 모두 쉘은 왼쪽( echo
또는 ls
)에 있는 프로그램을 실행하고 해당 프로그램은 각 인수에 대해 수행해야 할 작업을 수행합니다. *
확장자가 달라서 가 아니라 프로그램이 다르기 때문에 결과가 다릅니다 .