파일이 존재하지 않는 경우 오류를 발생시키지 않고 디렉터리의 각 파일을 반복합니다.

파일이 존재하지 않는 경우 오류를 발생시키지 않고 디렉터리의 각 파일을 반복합니다.

.profiles/ 디렉터리의 파일을 기반으로 별칭을 로드하고 싶습니다.

for profile in ~/.profiles/*; do
    for file in ~/.s1n7ax/$(basename $profile)/alias/*; do
        include "$file"
    done
done

그러나 내부에 파일이 없으면 ~/.s1n7ax/$(basename $profile)/alias/*오류가 발생합니다.

/home/s1n7ax/.zshrc:117: no matches found: /home/s1n7ax/.s1n7ax/work/alias/*

SDT에 오류를 출력하지 않고 이 문제를 정상적으로 처리하고 싶습니다.

답변1

기본적으로 zsh쉘은 일치하지 않는 파일 이름 와일드카드 패턴을 치명적인 오류로 처리합니다. glob이 일치하는 항목이 없을 것으로 예상되면 globbing 한정자를 사용하여 패턴을 다음과 같이 확장할 수 있습니다.아무것도 없다실패하는 대신:

for profile in ~/.profiles/*(.N); do
    for file in ~/.s1n7ax/$profile:t/alias/*(.N); do
        include $file
    done
done

N여기서 후행 괄호는 일치하는 파일 이름이 없으면 패턴을 완전히 사라지게 하여 해당 루프를 건너뛰게 합니다. 도트는 일반 파일만 선택하는 또 다른 한정자입니다. 아직도 일치 하시겠습니까?숨겨진D한정자 목록에 추가해야 하는 이름입니다 .

한정자는 쉘 옵션이 쉘에서 설정될 때 N와 패턴에 대해 동일한 효과를 가지며 , 설정과 동일한 효과를 갖습니다 . 일치하는 이름을 반복하고 테스트를 사용하여 각 이름을 테스트하는 것 외에는 동등한 점이 없습니다 .nullglobbashDdotglobbash-f

끝에 :t있는 것은 $profile"tail"의 약어이며 변수에 있는 경로 이름의 기본 이름을 제공합니다.

관련 정보