함수, 별명 및 실행 파일에 하이픈에 문제가 있습니까?


25

내 테스트 (Bash 및 Z Shell)에서 이름에 하이픈이있는 함수 또는 별칭 또는 실행 가능한 쉘 스크립트를 정의하는 데 아무런 문제가 없었지만 모든 쉘과 모든 사용 사례에서 이것이 괜찮을 것이라고 확신하지 못합니다 .

내가 이것을하고 싶은 이유는 하이픈이 밑줄보다 입력하기 쉽고 더 빠르고 부드럽게하기 때문입니다.

문제가 아니라고 믿어 주저하는 이유 중 하나는 일부 언어 (예 : 루비)에서 하이픈이 공백없이 마이너스 부호로 해석되기 때문입니다. 공백이 없어도 하이픈이 옵션을 표시하는 것으로 해석되는 일부 쉘에서 이와 같은 일이 발생할 수 있다는 것은 놀라운 일이 아닙니다.

내가 조금 의심스러운 또 다른 이유는 텍스트 편집기가 하이픈이있는 함수의 구문 강조를 망칠 수 있기 때문입니다. (물론 그것은 셸 스크립트의 구성을 강조하는 구문의 버그 일뿐입니다.)

하이픈을 피할 이유가 있습니까?

답변:


32

POSIX 및 하이픈 : 보증 없음

POSIX 표준에 따라 함수 이름 은 유효한 이름이어야하며 이름 은 다음으로 구성 될 수 있습니다.

3.231 이름
쉘 명령 언어에서 휴대용 문자 집합의 밑줄, 숫자 및 알파벳으로 만 구성된 단어. 이름의 첫 문자는 숫자가 아닙니다.

또한, 별명은 유효해야 별명 으로 구성 할 수 있습니다 :

3.10 별칭 이름
셸 명령 언어에서 휴대용 문자 집합의 밑줄, 숫자 및 알파벳 문자로만 구성된 단어와 '!', '%', ',', '@'

구현시 별칭 이름 내의 다른 문자를 확장명으로 사용할 수 있습니다. (엠파 시스 광산)

두 경우 모두 허용되어야하는 문자 에는 하이픈이 표시 되지 않습니다 . 따라서 사용되는 경우 이식성이 보장되지 않습니다.

하이픈을 지원하지 않는 쉘의 예

dash/bin/shdebian-ubuntu 제품군 의 기본 쉘 ( )이며 함수 이름에서 하이픈을 지원하지 않습니다.

$ a-b() { date; }
dash: 1: Syntax error: Bad function name

흥미롭게도, 그것은 않습니다 위에서 언급 한 바와 같이, 이것이 비록, 별칭에서 지원 하이픈을 구현 특성 이 아니라 요구 사항 :

$ a_b() { printf "hello %s\n" "$1"; }
$ alias a-b='a_b'
$ a-b world
hello world

busybox 쉘 (Almquist 쉘)은 함수 이름에서 하이픈을 지원하지 않습니다.

$ a-b() { date; }
-sh: Syntax error: Bad function name

쉘별 하이픈 지원 요약

다음 쉘은 함수 이름에서 하이픈을 지원하는 것으로 알려져 있습니다.

  • ksh, bash, zsh

다음 쉘은 함수 이름에서 하이픈을 지원 하지 않는 것으로 알려져 있습니다.

  • 재 (busybox), csh, tcsh, 대시

결론

  • 하이픈은 비표준입니다. 크로스 셸 호환성을 원하면 멀리하십시오.
  • 하이픈 대신 밑줄을 사용하십시오. 밑줄은 모든 곳에서 허용됩니다.

2
-그들 안에있는 이름 은 악하다. CSS를보고 있습니다. :)
PM 2Ring

감사. 내가 나중에 테스트 cshtcsh그들은 하나 하이픈을 지원하지 않지만, Korn 쉘은 않았다. a-b()함수 이름으로도 사용하는 것이 약간 재미 있습니다.
iconoclast

@iconoclast 나는 당신의 쉘 테스트 결과를 답변에 추가했습니다. 감사.
John1024

@ PM2Ring은 밑줄이있는 이름보다 입력하기가 쉽습니다. 허용되지 않는 시스템의 전통 또는 구현 결정을 제외하고, 그들이 악하다는 주장을지지하기 위해 어떤 원칙 을 지적 할 수 있습니까?
iconoclast

1
하이픈이 마이너스 부호로 해석되므로 하이픈이있는 @iconoclast 이름은 여러 언어에서 불가능하므로 이러한 언어가 하이픈이있는 이름을 지원하는 언어와 상호 운용되어야하는 경우 하이픈이있는 이름을 가진 엔터티가 강제로 실행되는 지저분한 상황이 발생합니다. 다른 언어로 된 이름이 다릅니다.
PM 2Ring

3

나는 이것이 정말로 늦다는 것을 알고 있지만 아마도 밑줄을보다 쉽게 ​​사용할 수 있도록하는 문제를 해결할 수 있습니다.

xmodmap -e "keycode  20 =  underscore minus"

밑줄이 하이픈 (빼기)으로 전환됩니다.

이제 하이픈으로 Shift 키를 누르고 있지만 밑줄은 Shift없이 입력됩니다.

키 코드가 다를 수 있지만 키보드에 따라 다릅니다. 내 키는 20 세입니다. 어떤 키 코드를 사용해야하는지 알려주세요.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.