확장되지 않은 별표로 인한 오류 방지 대해 작업을 수행합니다 *.type.

bash에서는 종종 다음과 같은 for 루프를 사용합니다.

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

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



답변

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

shopt -s nullglob

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

  • 이 동작을 기본적으로 원한다면 ~/.bashrc
  • POSIX 셸에서 null glob을 감지하려면 시도하십시오.

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

http://mywiki.wooledge.org/NullGlob 참조


답변

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

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


답변

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

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

추가 사항 [*].type*.type현재 디렉토리에 하나의 파일이있는 경우를 다루는 것 입니다.

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

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


답변

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

이것은 for방정식에서 루프와 쉘의 globbing을 완전히 제거합니다 . find실행합니다-exec일치 할 때마다 명령을 한 번 일치하는 항목이 없으면 실행되지 않습니다. -maxdepth 0에 지시는 (지정된 경로 인수의 하위 디렉토리로 재귀하지 않는 발견 .이 경우).

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