예를 들어 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*
하므로 이름이 지정된 파일을 만듭니다 . 따라서 유틸리티는 해당 파일 이름으로 호출됩니다 .xyz
touch
xyz
쉘에서 쉘 옵션을 bash
설정하면 쉘 glob이 아무것도 일치하지 않으면 쉘이 불평을 하게 됩니다.failglob
shopt -s failglob
$ shopt -s failglob
$ touch 123*
bash: no match: 123*
기본적으로 해당 옵션은 zsh
셸에서 켜져 있습니다.
nullglob
bash
(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*