"일반적인"파일 이름을 처리하는 쉘 스크립트를 작성했지만 왜 쉘 스크립트가 공백이나 다른 특수 문자에서 질식합니까?를 읽었습니다 . 그리고 왜 LS의 출력을 구문 분석하지 않아야 나는 유효한 파일 이름 (및 / 또는 디렉토리 이름)가 더 강력한 될 좋아하고 처리 할 것입니다. 스크립트를 실행할 파일 및 디렉토리의 테스트 베드를 어떻게 만들 수 있습니까?
"일반적인"파일 이름을 처리하는 쉘 스크립트를 작성했지만 왜 쉘 스크립트가 공백이나 다른 특수 문자에서 질식합니까?를 읽었습니다 . 그리고 왜 LS의 출력을 구문 분석하지 않아야 나는 유효한 파일 이름 (및 / 또는 디렉토리 이름)가 더 강력한 될 좋아하고 처리 할 것입니다. 스크립트를 실행할 파일 및 디렉토리의 테스트 베드를 어떻게 만들 수 있습니까?
답변:
재생할 별도의 디렉토리를 만듭니다 (주로 나중에 쉽게 정리할 수 있도록). 이것은 $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 진 코드는 nut 및 mutton으로 알려진 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 ...
a?b
하고 a*b
(물론 인용). @muru : 바이트 시퀀스 E2 (80) 83분의 82는 U + 2002 EN 공간과 U + 2003 EM 공간의 UTF-8 인코딩입니다
-
및 --
스크립트의 요구 사항에 따라, 어쩌면 선도적없이 액세스 할 불가능해야하지만, ./
. 그리고 나는 비 글로브 쉘 특수 문자로 이렇게 몇몇이 있다는 것을 놀랐어요, 같은 ;
, &
, |
, <
, >
, $
, (
, )
, {
, }
, =
, \
, !
,와 #
- 예를 들어, {a,b}
.