쉘 스크립트의 파일 처리 견고성을 어떻게 테스트 할 수 있습니까?


11

"일반적인"파일 이름을 처리하는 쉘 스크립트를 작성했지만 왜 쉘 스크립트가 공백이나 다른 특수 문자에서 질식합니까?를 읽었습니다 . 그리고 왜 LS의 출력을 구문 분석하지 않아야 나는 유효한 파일 이름 (및 / 또는 디렉토리 이름)가 더 강력한 될 좋아하고 처리 할 것입니다. 스크립트를 실행할 파일 및 디렉토리의 테스트 베드를 어떻게 만들 수 있습니까?

답변:


11

재생할 별도의 디렉토리를 만듭니다 (주로 나중에 쉽게 정리할 수 있도록). 이것은 $TMPDIR설정된 경우 의 값을 사용하고 , 그렇지 않으면 /tmp:

mkdir "${TMPDIR-/tmp}/testing"
cd "${TMPDIR-/tmp}/testing"

공백 (공백, 탭, 줄 바꿈, 캐리지 리턴, 백 스페이스)으로 인해 별개이지만 서로 비슷한 파일을 만듭니다.

touch -- a b 'a ' 'b ' 'a b' 'a  b' $'a\bb'
touch -- a$'\xe2\x80\x82'b a$'\xe2\x80\x83'b a$'\t'b a$'\n'b a$'\r'b

패트릭 에게 위의 신용 . 두 개의 16 진 코드는 nutmutton으로 알려진 UTF-8 공간 분리기입니다 . "양방향 문맥에서 이것은 공백으로 작용하며 미러링되지 않습니다. 상황에 따라 글리프는 20 개의 다른 글리프와 혼동 될 수 있습니다."

일반 파일과 글로 취급되는 경우 처음으로 확장되는 파일을 작성하십시오.

touch -- x '[x]' 

Wumpus Q. Wumbley 에게 위의 크레딧 .

비슷한 맥락에서 :

touch -- 'a?b' 'a*b'

여기 코멘트 에 dave_thompson_085 에게 위의 크레딧 .

touch -- foo\`echo\ malicious\`bar

위의 godlygeek에 대한 신용 .

셸 컨텍스트에서 평가되는 경우 다른 것으로 확장 될 가능성이있는 임의의 실행 파일 이름입니다.

touch '$( echo boom )'

사용하다:

touch -- single\'quote double\"quote back\\slash

따옴표를 이탈하지 않고 파일 이름을 따옴표로 묶으려고 시도합니다.

touch -- -a -b -c -r -R - a=x

Stéphane Chazelas 에게 위의 크레딧 .

명명 된 파이프와 심볼릭 링크를 작성하십시오 ( "일반"이 아닌 파일을 작성하려면).

mkfifo fifo
ln -s a alink

내부에 토큰 파일과 함께 이름에 다양한 공백이 포함 된 서브 디렉토리를 작성하십시오.

mkdir subdir "subdir 1" "subdir 2" "subdir 3 " subdir$'\n'4
touch subdir/file0 "subdir 1"/file1 "subdir 2"/file2 "subdir 3 "/file3 subdir$'\n'4/file4

*(일반적으로!) 공간, 데드 심볼릭 링크, 자신을 반복하는 심볼릭 링크 및 상위 디렉토리로 다시 연결되는 서브 디렉토리로만 구성된 파일 이름 만 포함 (제거하기에 문제가있는) 파일 이름을 작성하십시오.

touch -- '*' '**' '***' ' '

ln -s /does/not/exist dead

ln -s loop loop

mkdir subdir_with_link
(cd subdir_with_link && ln -s .. parent)

더 많은 기타 파일 이름. 마지막 두 개는 "분수 슬래시"및 "분할 슬래시"에 대한 유니 코드입니다.

touch -- '(' '!' '!!'  $'\xe2\x81\x84' $'\xe2\x88\x95'

Scott의 아이디어 :

touch -- '-' '--' ';' '&' '|' '<' '>' '$' ')' '{' '}' = \\ '!' '#' '{a,b}'

일부 지역에서는 무해하지만 다른 지역에서는 위험한 캐릭터 :

touch $'X\xa0Y' # non-breaking space in iso8859-1 which is considered
                # "blank" and "space" in some locales

touch $'\xa3\x5c' $'\xa3\x60' # α and ε in BIG5 or BIG5-HKSCS charset, but
                              # �\ and �` in ASCII

일부 로케일에서 동일하게 정렬되는 문자 :

touch   # sorts the same in GNU locales, order non-deterministic.

.[!.]* *glob 를 피하는 파일 (숨겨진 파일과 숨겨지지 않은 파일을 모두 확장하는 데 사용되는 파일)

touch ..foo ...

"의견"주석의 아이러니가 산만하다; 다양한 명령이 수행하는 작업에 대한 설명을 추가하려고합니까?
Jeff Schaller

1
예, 가장 많이 생성하는 테스트 사례를 설명하십시오. 유니 코드 문자처럼 보이는 테스트 사례는 그렇지 않습니다.
muru

1
추가 a?b하고 a*b(물론 인용). @muru : 바이트 시퀀스 E2 (80) 83분의 82는 U + 2002 EN 공간과 U + 2003 EM 공간의 UTF-8 인코딩입니다
dave_thompson_085

직장에서 어떤 악한 천재들 : -c
user207673

놀 재미있을 수 ---스크립트의 요구 사항에 따라, 어쩌면 선도적없이 액세스 할 불가능해야하지만, ./. 그리고 나는 비 글로브 쉘 특수 문자로 이렇게 몇몇이 있다는 것을 놀랐어요, 같은 ;, &, |, <, >, $, (, ), {, }, =, \, !,와 #- 예를 들어, {a,b}.
Scott
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.