두 확장의 차이점

두 확장의 차이점

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. echowith 를 사용 *하면 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의 탁월한 답변을 명확히하기 위해 차이가 없습니다. *두 경우 모두 쉘에 의해 확장되며 두 경우 모두 정확히 동일한 것으로 확장됩니다. 차이점은 그들의 주장을 다루는 방식 echols처리 에 있습니다.

echo제공한 각 매개변수만 인쇄됩니다. ls~ 할 것이다list directory contents설명서대로 입니다. 따라서 두 경우 모두 쉘은 왼쪽( echo또는 ls)에 있는 프로그램을 실행하고 해당 프로그램은 각 인수에 대해 수행해야 할 작업을 수행합니다. *확장자가 달라서 가 아니라 프로그램이 다르기 때문에 결과가 다릅니다 .

관련 정보