쉘 유효 함수 이름 문자


13

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

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

tést() { echo 34; }

tést

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

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

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

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

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

질문은 :

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

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

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


당신은 찾을 수 alias태드 더의 엄밀하게. 따라서 버튼을 사용하여 적절한 이름으로 함수를 작성한 다음 더 스타일리쉬 한 별명을 정의하여 함수를 호출 할 수 있습니다. 에 dash또한 몇 가지 물건이 당신이 함께 할 수있는 $PATH%func.
mikeserv

답변:


16

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

실패하게


posh그런 목록에 등재 될 가치가 없습니다. Linux 특정 버그에 따라 다르며 libc다른 플랫폼에서는 작동하지 않습니다.
schily

ksh93원래 소스에서 자체 컴파일 된 ksh93 사용에 대한 귀하의 주장을 반복 할 수 없습니다 . 반면 ksh88함수 이름에 대한 비 7 비트 ASCII 문자를 받아들이는 것, 단지 ksh93우분투에서 바이너리를 받아 들일 것으로 보인다.
schily

이 테스트에서 사용한 @schily ksh는 데비안의 바이너리입니다 (따라서 우분투의 것과 동일 할 수 있습니다)
cuonglm

9

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

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

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

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

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

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

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


하나부터 시작 너무 떠들썩한 파티에서 게임을 즐길 수 function /bin/sh { echo "$0: $FUNCNAME: Permission denied"; return 126; }및 잠재적으로 유용한 일을 너무라는 이름의 기능 --, //, @또는 %
mr.spuratic

그러나 /이름에서 발견 되면 쉘은 해시 테이블 조회를 우회하는 경향이 있습니까? 그리고 함수는 실행 가능한 이름이 아니라 코드입니다. 저장된 함수 이름에 메타 문자가 포함되어 있으면 간단한 구현에 많은 구문 분석 문제가 발생할 수 있다고 생각합니다.
mikeserv

예, bash가 vars에 null을 포함 할 수 없다는 것을 알고 있습니다. 이는 함수 이름으로 확장 될 수 있습니다. 구체적인 예는 없지만, 이름에 거의 모든 것을 허용하는이 게임이 "쉬운 작업 방법"보다 잠재적 인 보안 위반이라고 생각합니다. 내가 틀 렸으면 좋겠다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.