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


16

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

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

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

답변:


20

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

shopt -s nullglob

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

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

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

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


1
실제로라는 파일을 가질 수 있습니다 *.txt. 파일이 존재하는지 확인하는 것이 좋습니다.
Chris Down

그에 따라 게시물이 수정되었습니다.
Gilles Quenot

@ChrisDown 귀하의 답변과 동일한 의견이 여기에 적용됩니다 ( break대신에 더 심각한 결과가 발생할 수 있음 continue).
Stéphane Chazelas

6

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

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


1
[ -e액세스 할 수없는 파일이나 액세스 할 수 없거나 존재하지 않는 파일에 대한 심볼릭 링크 인 파일의 경우 false를 반환 하므로 엄격하게 동등하지는 않습니다 .
Stéphane Chazelas

@StephaneChazelas, 심볼릭 링크에 대한 요점을 인정하십시오. 그러나 "액세스 할 수없는 파일"이란 무엇을 염두에두고 있습니까? I chmod 0 the_file[ -e the_file ]여전히 평가 되더라도 다른 것이어야합니다.
dubiousjim

1
깨진 심볼릭 링크를 처리하기 위해 편집을 제출했습니다. 괜찮 으시길 바랍니다.
dubiousjim

2
@dubiousjim, mkdir -p x/{a,b} && chmod 444 x && echo x/* && [ -e x/a ]. x / a는 액세스 할 수 없지만 x는 읽을 수 있으므로 x / *는 확장됩니다.
Stéphane Chazelas

@StephaneChazelas, 설명해 주셔서 감사합니다.
dubiousjim 2016

4

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

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

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

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

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


0

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.