.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
와 패턴에 대해 동일한 효과를 가지며 , 설정과 동일한 효과를 갖습니다 . 일치하는 이름을 반복하고 테스트를 사용하여 각 이름을 테스트하는 것 외에는 동등한 점이 없습니다 .nullglob
bash
D
dotglob
bash
-f
끝에 :t
있는 것은 $profile
"tail"의 약어이며 변수에 있는 경로 이름의 기본 이름을 제공합니다.