쉘 유효 함수 이름 문자 것 같습니다. POSIX

확장 유니 코드 문자를 사용하는 것은 많은 사용자에게 유용합니다.

더 간단한 쉘 (ash (busybox), dash) 및 ksh는 다음과 같이 실패합니다.

tést() { echo 34; }

tést

그러나 , , 가 허용하는 것 같습니다.

POSIX 유효한 함수 이름 은이 Names 정의를 사용 한다는 것을 알고 있습니다. 이것은이 정규식을 의미합니다.

[a-zA-Z_][a-zA-Z0-9_]*

그러나 첫 번째 링크에서도 다음과 같이 말합니다.

구현시 함수 이름의 다른 문자를 확장명으로 사용할 수 있습니다.

질문은 :

  • 이것이 받아 들여지고 문서화됩니까?
  • 어디?
  • 어떤 껍질 (있는 경우)?

관련 질문 :
쉘 함수 이름에 특수 문자를 사용할 수 있습니까?
함수 이름에 메타 문자 (>)를 ​​사용하는 데 관심이 없습니다.

“-“를 포함하는 Upstart 및 bash 함수 이름
연산자 (빼기 “-“)가 이름의 일부 여야한다고 생각하지 않습니다.



답변

POSIX 문서는이를 확장으로 허용하므로 해당 동작으로 인해 구현을 방해하는 것은 없습니다.

간단한 확인 (에서 실행 zsh) :

$ for shell in /bin/*sh 'busybox sh'; do
    printf '[%s]\n' $shell
    $=shell -c 'á() { :; }'
  done
[/bin/ash]
/bin/ash: 1: Syntax error: Bad function name
[/bin/bash]
[/bin/dash]
/bin/dash: 1: Syntax error: Bad function name
[/bin/ksh]
[/bin/lksh]
[/bin/mksh]
[/bin/pdksh]
[/bin/posh]
/bin/posh: á: invalid function name
[/bin/yash]
[/bin/zsh]
[busybox sh]
sh: syntax error: bad function name

이 보여 bash, zsh, yash, ksh93(이 ksh내 시스템에 연결), pdksh및 그 파생 함수 이름으로 문자를 멀티 – 바이트 수 있습니다.

yash 처음부터 멀티 바이트 문자를 지원하도록 설계되었으므로 놀랍지 않습니다.

참조 할 수있는 다른 문서는 ksh93다음과 같습니다.

공백은 탭 또는 공백입니다. 식별자는 문자 나 밑줄로 시작하는 일련의 문자, 숫자 또는 밑줄입니다. 식별자는 변수 이름의 구성 요소로 사용됩니다. vname은로 구분 된 하나 이상의 식별자 시퀀스입니다. 선택적으로 앞에 ..가옵니다. Vnames는 함수 및 변수 이름으로 사용됩니다. 단어는 인용되지 않은 메타 문자를 제외 하고 현재 로케일로 정의 된 문자 세트 의 문자 시퀀스입니다 .

C로케일로 설정 :

$ export LC_ALL=C
$ á() { echo 1; }
ksh: á: invalid function name

실패하게


답변

함수는 파일 시스템의 명령을 포함하여 다른 명령과 동일한 네임 스페이스를 공유합니다. 대부분의 시스템에서는 문자 나 경로에 포함 할 수있는 바이트에 제한이 없습니다.

따라서 대부분의 쉘은 함수의 특성을 제한하지만 그렇게 할 이유는 없습니다. 즉, 해당 쉘에는 함수로 바꿀 수없는 명령이 있습니다.

zshrc일부를 포함하여 그 기능 이름에 대한 아무것도 할 수 /및 빈 문자열입니다. zshNUL 바이트도 허용합니다.

$ zsh
$ $'\0'() echo nul
$ ^@
nul
$ ""() uname
$ ''
Linux
$ /bin/ls() echo test
$ /bin/ls
test

쉘의 간단한 명령은 인수 목록이며 첫 번째 인수는 실행할 명령을 파생시키는 데 사용됩니다. 따라서 이러한 인수와 함수 이름은 동일한 값을 공유하고 zsh내장 및 함수 에 대한 인수는 임의의 바이트 시퀀스가 ​​될 수 있습니다.

보안 문제는 함수로 여기가 아니다 당신 (스크립트 작성자가) 사람입니다 정의 당신이 호출합니다.

보안 문제가있을 수있는 곳은 구문의 환경에 영향을받는 경우입니다 (예 : 함수의 유효한 이름이 로캘의 영향을받는 쉘).


답변