세 개의 파일이 있는 폴더가 있다고 가정해 보겠습니다.
foo1
foo2
bar
1. 내가 달리면
list_of_files=$(print foo*)
echo $list_of_files
나는 얻다:foo1 foo2
2.내가 달리면
list_of_files=$(print bar*)
echo $list_of_files
나는 얻다:bar
삼.그러나 내가 달리면
list_of_files=$(print other*)
echo $list_of_files
나는 다음을 얻습니다: ( zsh: no matches found: other*
변수가 $list_of_files
비어 있음에도 불구하고)
glob 확장자와 일치할 수 없을 때 zsh가 불평하지 않도록 하는 방법이 있습니까?
내 목표는 위의 메커니즘을 사용하는 것입니다아무 말 않고주어진 glob 패턴과 일치하는 파일 목록을 수집합니다.
답변1
null_glob
패턴 에 대해 glob 한정자를 사용하는 옵션을 활성화합니다 N
.
list_of_files=(*(N))
스크립트나 함수의 모든 패턴에 대해 이 작업을 수행하려면 다음 null_glob
옵션을 설정하세요.
setopt null_glob
이 답변bash 및 ksh와 동등한 것이 있습니다.
대체 명령을 사용하거나 명령하지 마십시오 print
! 이렇게 하면 문자열 목록이 아닌 파일 이름 사이에 공백이 있는 문자열이 생성됩니다. (바라보다분사란 무엇입니까? 쉘 프로그래밍에서 이것이 왜 중요한가요?)
답변2
더 나은 접근 방식: for a in *(.N); do ... ; done
.N 옵션을 사용하면 zsh가 for에 빈 목록을 전달하고 for는 0회 반복됩니다.
ls *.foo(.N)
ls가 빈 인수 목록을 받으면 파일을 나열하지 않고 모든 파일을 나열합니다 . 이것이 내가 NULL_GLOB(또는 그에 상응하는 bash)를 좋아하지 않는 이유입니다.모두와일드카드는 예를 들어 ls에 대한 호출을 쉽게 중단할 수 있습니다.
답변3
나는 당신이 다음 옵션을 찾고 있다고 생각합니다 NULL_GLOB
.
NULL_GLOB (-G) If a pattern for filename generation has no matches, delete the pattern from the argument list instead of reporting an error. Overrides NOMATCH.
답변4
다음 방법을 시도해 보세요.
list_of_files=$(print other*) 2>/dev/null
오류 출력을 stderr에서 /dev/null로 리디렉션하고 표시하지 않습니다.