`echo test?`는 `test2`를 인쇄하지만 `ls test?`는 아무것도 인쇄하지 않습니다.

`echo test?`는 `test2`를 인쇄하지만 `ls test?`는 아무것도 인쇄하지 않습니다.

나는 최근 bash globbing을 가지고 놀다가 다음을 발견했습니다.

먼저 2개의 디렉터리를 만듭니다.

$ mkdir test
$ mkdir test2

그 다음에:

$ echo test?

출력(올바른):

test2

하지만:

$ ls test?

아무것도 출력되지 않습니다...

그러나 디렉터리(test3)를 하나 더 생성하면 예상 echo대로 작동합니다 ls.

왜 이런 일이 일어나는지 아는 사람이 있나요?

답변1

기본부터 이해해 보도록 하겠습니다.

mkdir test
touch file
mkdir test1
mkdir test2

?단 하나의 문자만 검색합니다 .

이제 명령을 실행하면 ls tes?출력은 file.

디렉토리에 파일을 생성하기 때문에 작동합니다. 매뉴얼 페이지 ls에서

NAME
       ls - list directory contents

디렉터리에는 내부 구조가 test있으므로 명령은 실제로 디렉터리에 있는 파일을 나열합니다.filels

이제 다음과 같이 파일을 생성해 보겠습니다.

touch ramesh
ls rames?
ramesh

위 명령이 작동하는 이유는 ramesh파일이 있고 현재 디렉터리에 존재하기 때문입니다(work 에 따르면 ls디렉터리 내용을 나열하고 실제로 현재 디렉터리에 이름이 파일이 있음 ramesh).

이제 다음과 같은 이름의 디렉터리를 생성해 보겠습니다 ram1.

mkdir ram1
ls ram?

위의 내용은 아무것도 출력하지 않습니다. 이는 ram1현재 디렉터리에 파일이 없기 때문입니다. 이제 이라는 다른 디렉터리를 만들고 ram2시도해 보면 먼저 ram1디렉터리에 파일이 있는지 확인한 다음 ram2디렉터리에 파일이 있는지 확인하기 때문에 작동합니다. ls정렬의 역할을 기억하세요 .

내부 작동에 대해 더 자세히 알고 싶다면 stat명령을 실행하십시오.

이 경우 stat ram?다음과 같은 출력이 생성됩니다.

  File: `ram1'
  Size: 4096            Blocks: 8          IO Block: 4096   directory
Device: 805h/2053d      Inode: 6743976     Links: 2
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2014-06-30 18:17:06.000000000 -0500
Modify: 2014-06-30 18:17:03.000000000 -0500
Change: 2014-06-30 18:17:03.000000000 -0500

관련 정보