파일 이름의 경우 파일 이름에 공백을 포함하려면 큰따옴표나 백슬래시를 사용해야 한다는 것을 알고 있습니다.
좋아요 mkdir "I like coffee"
는 똑같습니다mkdir I\ like\ coffee
이제 파일 이름에 $를 포함시키려면 백슬래시를 사용해야 합니다.
좋다mkdir \$dollar
파일 이름을 지정할 때 사용해야 하는 공백과 달러 기호 외에 다른 문자는 무엇인지 궁금합니다.
찾았어요? 그리고 *는 잘 작동하는데 다른 캐릭터들은 이런지 궁금하네요.
답변1
Unix 파일 이름에는 모든 문자("/" 또는 "\0" 제외)가 포함될 수 있으므로 이는 실제로 셸 문제이며 이스케이프해야 하는 메타 문자 목록은 셸 및 셸의 특정 구성에 따라 다릅니다. bash를 사용하는 것 같습니다. ? 또는 *glob 표현식이 인용되지 않으면 다른 쉘이 실패합니다.
$ mkdir test && cd test
$ ls
$ touch *foo
$ ls
*foo
$ exec zsh
% touch *bar
zsh: no matches found: *bar
% ls
*foo
%
bash는 이와 관련하여 zsh처럼 작동하도록 failedglob 쉘 옵션을 설정할 수 있습니다. 일반적으로 모든 내용을 인용하거나 Unix 파일 이름에 메타 문자(또는 공백)를 넣지 않는 것이 좋습니다. 해당 경로로 인해 rm -rf
호출이 전체 디렉토리 트리를 손상시키거나 무작위로 실패할 수 있습니다(파일은 -i
인수로 읽혀집니다). ) 또는 쉘 코드의 보안 문제.
답변2
아직 관심 있는 쉘을 작성하지 않았습니다. GNU 병렬 참조의 모든 문자열 ash bash csh dash fdsh fish fizsh ksh ksh93 mksh pdksh posh rbash rc rush rzsh sash sh static-sh tcsh yash zsh
. 각각 약간씩 다른 문자열 참조가 필요합니다. 자세한 내용은 "sub shell_quote_scalar"를 참조하세요.http://git.savannah.gnu.org/cgit/parallel.git/tree/src/parallel
핵심 라인은 다음과 같습니다.
- bash-가족: s/[\002-\011\013-\032\#\?`(){}[]\^*\<\=>\~\|\; '\202-\377]/\$&/go; s/[\n]/'\n'/go
- csh-가족: s/[\002-\011\013-\032\#\?`(){}[]\^*\<\=>\~\|\; '\202-\377]/\$&/go; s/[\n]/"\\n"/go
- rc: s/'/''/g; s/[\n\002-\011\013-\032\#\?`(){}[]\^*\<\=>\~\|\ ; \"!\$\&\'\202-\377]+/'$&'/go
일부 쉘의 경우 특정 쉘에 필요한 것보다 더 많은 문자를 인용하지만 이러한 문자는 다른 쉘에서 인용해야 할 수도 있습니다. 예를 들어 '='는 bash에서는 인용할 필요가 없지만 zsh에서는 인용해야 합니다.
bash$ echo =wc
=wc
zsh% echo =wc
/usr/bin/wc
zsh% echo \=wc
=wc