쉘 유효한 함수 이름 문자

쉘 유효한 함수 이름 문자

확장된 유니코드 문자를 사용하는 것은 의심의 여지 없이 많은 사용자에게 유용합니다.

더 간단한 쉘(ash(busybox), 대시) 및 ksh는 실패합니다.

tést() { echo 34; }

tést

하지만,,, 그리고허락하는 것 같습니다.

나는 POSIX를 안다유효한 함수 이름이 정의를 사용하세요이름. 이는 다음 정규식을 의미합니다.

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

그러나 첫 번째 링크에는 다음과 같은 내용도 나와 있습니다.

구현 시 함수 이름에 확장자로 추가 문자를 허용할 수 있습니다(MAY).

문제는 다음과 같습니다

  • 이것이 승인되고 문서화되었나요?
  • 어디?
  • 어떤 쉘에 적용됩니까(있는 경우)?

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

Upstart 및 bash 함수 이름에는 "-"가 포함됩니다.
나는 연산자(빼기 "-")가 이름의 일부가 되어야 한다고 생각하지 않습니다.

답변1

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은 로 구분된 하나 이상의 식별자 시퀀스입니다. 선택적으로 .가 앞에 붙습니다. Vname은 함수 및 변수 이름으로 사용됩니다. 단어는 일련의 문자이다.현재 로케일에 의해 정의된 문자 세트, 인용되지 않은 메타 문자는 제외됩니다.

따라서 C로케일로 설정하십시오.

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

실패하게 만드세요.

답변2

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

따라서 대부분의 쉘은 기능의 특성을 제한하지만 실제로는 그렇게 할 충분한 이유가 없습니다. 이는 이러한 쉘에서 일부 명령을 함수로 대체할 수 없음을 의미합니다.

zshrc함수 이름에 일부 문자열 /과 빈 문자열을 포함하여 무엇이든 포함할 수 있습니다. zshNUL 바이트도 허용됩니다.

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

셸의 간단한 명령은 인수 목록으로, 첫 번째 인수는 실행할 명령을 파생하는 데 사용됩니다. 따라서 이러한 매개변수와 함수 이름은 동일한 값을 공유하고 zsh내장 함수와 함수의 매개변수는 임의의 바이트 시퀀스일 수 있다는 것이 논리적입니다.

여기 기능에는 보안 문제가 없습니다.(스크립트 작성자)는 이를 정의합니다.옮기다.

구문 분석이 환경의 영향을 받는 경우 보안 문제가 발생할 수 있습니다. 예를 들어 셸에서 함수의 유효한 이름은 로케일의 영향을 받습니다.

관련 정보