확장되지 않은 별표로 인한 오류 방지

확장되지 않은 별표로 인한 오류 방지

Bash에서는 아래와 같이 for 루프를 자주 사용합니다.

for file in *.type; do 
  sommecommand "$file"; 
done;

일치하는 모든 파일에 대해 작업을 수행합니다 *.type. 이 끝을 가진 파일이 작업 디렉토리에 없으면 별표가 확장되지 않으며 일반적으로 일부 명령으로 파일을 찾을 수 없다는 오류 메시지가 나타납니다. 나는 이 실수를 피할 수 있는 여러 가지 방법을 즉시 생각해 낼 수 있습니다. 그러나 조건을 추가하는 것은 그다지 우아해 보이지 않습니다. 이를 달성하는 짧고 깨끗한 방법이 있습니까?

답변1

예, 다음 명령을 실행하십시오:

shopt -s nullglob

일치가 무효화되고 오류가 발생하지 않습니다.

  • 기본적으로 이 동작을 원하면 다음 명령을~/.bashrc
  • POSIX 쉘에서 빈 글로브를 감지하려면 다음을 시도하십시오.

    for i in *.txt; do
      [ "$i" = '*.txt' ] && [ ! -e '*.txt' ] && continue
    done
    

바라보다http://mywiki.wooledge.org/NullGlob

답변2

shopt -s nullglobBash에서는 일치하는 항목이 없으면 빈 배열로 확장을 사용할 수 있습니다.

가 없는 POSIX 쉘에서는 has 를 루프의 첫 번째 부분으로 nullglob사용하여 전달된 파일 이름이 실제로 존재하는지 확인함으로써 이 문제를 피할 수 있습니다 .[ -e "$file" ] || [ -L "$file" ] || continuefor

답변3

옵션이 없는 쉘의 경우 일반적인 기술 nullglob은 다음과 같습니다.

set -- [*].type *.type
case $1$2 in
  '[*].type*.type') shift 2;;
  *) shift
esac
for file do
  cmd  -- "$file"
done

추가 내용은 [*].type현재 디렉터리에서 파일 호출을 다루는 것입니다.*.type

이제 도트 파일을 포함하려면이게 더 복잡해진다.

나는 이 기술이 몇 년 전 유즈넷에서 Laura Fairhead에 의해 만들어졌다고 믿습니다.

답변4

find . -name '*.type' -maxdepth 0 -exec somecommand "{}" ";"

이렇게 하면 for방정식에서 루프와 쉘 와일드카드가 완전히 제거됩니다. 명령은 일치하는 항목마다 한 번씩 find실행되며 -exec, 일치하는 항목이 없으면 실행되지 않습니다. 지정된 경로 인수의 하위 디렉터리(이 경우) -maxdepth 0로 재귀하지 않도록 find에 지시합니다 ..

단점은 이 응용 프로그램이 거의 모든 Linux 시스템(그리고 아마도 대부분의 Unix에도)에 존재하지만 다른 응용 프로그램과 관련이 있다는 것입니다.

관련 정보