"*"가 다른 명령에서 다르게 작동하는 이유는 무엇입니까?

"*"가 다른 명령에서 다르게 작동하는 이유는 무엇입니까?

예를 들어 in은 rm -r abc* "*"모든 문자열을 의미합니다. 그러나 touch abc* abcd* abcde*이를 in에서 사용하면(그리고 abc, abcd 또는 abcde로 시작하는 디렉토리에 파일이 없는 경우) "*"이는 단지 기호만을 의미하며 abc* abcd* abcde*파일이 생성됩니다. 나중에 파일을 사용하면 touch -m ab*수정 시간이 abc* abcd* abcde*변경됩니다.

어떤 경우에는 문자열을 의미 "*"하고 다른 경우에는 기호만을 의미하는 이유는 무엇입니까? 컴퓨터는 언제 의미를 바꿔야 하는지 어떻게 알 수 있나요?

답변1

따옴표가 없는 패턴이 셸에서 사용되면 abc*셸은 이를 사용 가능한 파일 이름과 일치시키려고 시도합니다(이를 "파일 이름 생성"이라고 하지만 종종 "글로빙"이라고도 함). 파일 이름과 일치할 수 없는 경우 대부분의 sh유사한 쉘은 패턴을 확장하지 않은 상태로 두고 그대로 유틸리티에 전달합니다.

예:

$ touch xyz
$ touch abc*
$ tree
.
|-- abc*
`-- xyz

0 directory, 2 files
$ touch xyz*
$ tree
.
|-- abc*
`-- xyz

0 directory, 2 files

touch xyz*명령이 실행되었습니다.아니요파일 이름이 패턴과 일치 xyz*하므로 이름이 지정된 파일을 만듭니다 . 따라서 유틸리티는 해당 파일 이름으로 호출됩니다 .xyztouchxyz

쉘에서 쉘 옵션을 bash설정하면 쉘 glob이 아무것도 일치하지 않으면 쉘이 불평을 하게 됩니다.failglobshopt -s failglob

$ shopt -s failglob
$ touch 123*
bash: no match: 123*

기본적으로 해당 옵션은 zsh셸에서 켜져 있습니다.

nullglobbash(or) 에서 NULL_GLOB쉘 옵션을 설정하면 zsh파일 이름과 일치하지 않으면 패턴이 사라집니다.

$ shopt -s nullglob
$ touch fo*
usage: touch [-acm] [-d ccyy-mm-ddTHH:MM:SS[.frac][Z]] [-r file]
             [-t [[cc]yy]mmddHHMM[.SS]] file ...

touch(아무 매개변수도 없이 호출했기 때문에 에러가 발생합니다)

패턴이 (있는 그대로) 문자열로 사용되는지 확인하고아니요와일드카드의 경우 이를 인용해야 합니다.

$ touch "file*"
$ touch "file**"
$ touch "file***"
$ tree
.
|-- file*
|-- file**
`-- file***

0 directory, 3 files

이 예에서 파일 이름을 인용하지 않으면 및 패턴이 이름과 일치하므로 이름 이 지정된 파일만 제공됩니다 file*(디렉토리가 처음에 비어 있는 경우) .file**file***file*

관련 정보