일치하지 않는 전역 패턴에서 빈 문자열을 자동으로 가져오는 방법

일치하지 않는 전역 패턴에서 빈 문자열을 자동으로 가져오는 방법

세 개의 파일이 있는 폴더가 있다고 가정해 보겠습니다.

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로 리디렉션하고 표시하지 않습니다.

관련 정보