*
다른 glob 패턴은 현재 작업 디렉터리를 기반으로 하는 경로 이름 확장을 통해 단어로 변환된다는 것을 알고 있습니다 . 그러나 일부 명령에서는 파일이 아닌 매개변수에 대해 이를 사용하는 것 같습니다. 예를 들어, 나는 프로그램이 확장 이전에는 dpkg -l pkg-*
인수 pkg-
를 볼 수 없고 확장 후에만 볼 수 있다고 생각했습니다. 그렇지 않습니까? 어떻게 작동하나요?
나는 최근에 저자가 부르는 이상한 배쉬에 대해 읽었습니다.마법의 별칭, 제 생각엔 이 작업을 수행하는 데 사용될 수 있을 것 같습니다.
답변1
문제는 pkg-*
현재 디렉터리의 어떤 파일과도 일치하지 않으면 그대로 dpkg에 전달된다는 것입니다. 이것은 실제로 나쁜 생각입니다. 사람들은 항상 그것을 인용해야 합니다. 예를 들어:dpkg -l pkg-\*
답변2
당신 말이 맞습니다. 프로그램은 쉘 확장 인수만 볼 수 있고 원래 와일드카드는 볼 수 없습니다. 그러나 Bourne 셸과 그 후속 항목(ksh, bash, dash 등)은 0개 파일과 일치하는 경우 와일드카드를 확장하지 않습니다. 따라서 pkg-
현재 디렉토리에 이름이 시작하는 파일이 없으면 및 dpkg -l pkg*
매개변수가 에 전달됩니다.-l
pkg-*
dpkg
이는 파일 이름으로 해석되지 않고 파일 이름과 일치하지 않는 단어에 와일드카드 문자를 인용하지 않도록 편의를 위해 수행됩니다. 그러나 일부 쉘은 다르게 동작하고 와일드카드가 아무것도 일치하지 않으면 명령을 중단할 수 있습니다(csh, tcsh, zsh 및 Fish의 기본 동작 - 여러 개의 연속 패턴이 없는 한, 그 중 일부는 내용만큼 아무것도 일치할 수 없음 ). 파일 중 하나가 일치함) 또는 확장 와일드카드 일치( zsh의 N
glob 수정자 또는 null_glob
쉘 옵션 , N
ksh의 패턴 옵션, nullglob
bash의 쉘 옵션). 후자의 동작은 규칙성(일치하지 않는 패턴이 하나 이상의 파일과 일치하는 패턴과 동일하게 일치 목록으로 확장됨)이라는 장점이 있어 스크립트에서 더 많이 사용됩니다.
패턴이 예기치 않게 확장되지 않도록 하려면 와일드카드 문자( dpkg -l 'pkg-*'
또는 ) 를 인용하십시오 dpkg -l pkg-\*
.
일반적으로 사용되는 쉘은 어떤 명령의 매개변수가 파일인지(와일드카드가 필요함), 어떤 매개변수가 단독으로 남겨두는 것이 가장 좋은지 알지 못합니다. Zsh는 noglob
특정 명령 앞에 와일드카드를 작성하여 해당 명령에 대한 와일드카드를 비활성화할 수 있습니다(예: noglob dpkg -l pkg-*
. noglob
예를 들어 별칭에 자주 사용됩니다 alias lynx='noglob lynx'
. Simon Tatham이 설명한 bash "마법 별칭"은 zsh의 noglob
.