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

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

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

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

문제가 되지 않는다고 믿기가 꺼려지는 한 가지 이유는 일부 언어(예: Ruby)에서는 하이픈 주위에 공백이 없어도 빼기 기호로 해석되기 때문입니다. 하이픈이 공백 없이도 옵션을 나타내는 것으로 해석되는 일부 셸에서 이와 같은 일이 발생할 수 있다는 것은 놀라운 일이 아닙니다.

제가 약간 의심스러운 또 다른 이유는 제 텍스트 편집기가 하이픈이 있는 함수의 구문 강조를 망쳐놨기 때문입니다. (물론 이는 쉘 스크립트의 구문 강조 구성에 있는 버그일 수도 있습니다.)

하이픈을 피해야 할 이유가 있나요?

답변1

POSIX 및 하이픈: 보장 없음

POSIX 표준에 따르면,함수 이름유효한 이름이어야 하며이름다음으로 구성될 수 있습니다:

3.231 이름
쉘 명령 언어에서 이식 가능한 문자 세트의 밑줄, 숫자 및 알파벳만으로 구성된 단어입니다. 이름의 첫 글자가 숫자가 아닙니다.

추가적으로,별칭유효해야 합니다별칭 이름, 이는 다음으로 구성될 수 있습니다.

3.10 별칭 이름
쉘 명령 언어에서 휴대용 문자 세트의 밑줄, 숫자, 알파벳과 '!', '%', ',', '@' 문자로만 구성된 단어입니다.

구현에서는 별칭 이름 내의 다른 문자를 확장자로 허용할 수 있습니다. (강조합니다.)

하이픈은~ 아니다두 경우 모두 허용되어야 하는 문자 중 하나가 나열됩니다. 따라서 사용하더라도 이식성은 보장되지 않습니다.

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

dashdebian-ubuntu 계열의 기본 셸( /bin/sh)이며 함수 이름에 하이픈을 지원하지 않습니다.

$ 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 셸(ash 기반 셸만 해당)도 함수 이름에 하이픈을 지원하지 않습니다.

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

Shell의 하이픈 지원 요약

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

  • pdksh 및 파생 상품, bash, zsh
  • FreeBSD의 sh와 같은 일부 Ash 파생물(2010년부터) 또는 NetBSD(2016년부터.
  • hushbusybox sh 는 컴파일 타임에 선택된 쉘이 ash.
  • csh 및 tcsh(별칭으로 해당 쉘에는 기능 지원이 없습니다). 어쨌든 해당 셸은 근본적으로 다른 구문을 가지므로 해당 셸과 상호 셸 호환성을 가질 희망은 없습니다.
  • rc 및 파생 상품(다시 근본적으로 다른 구문 사용)
  • fish (역시 근본적으로 다른 구문을 사용함)

다음 껍질이 알려져 있습니다.~ 아니다함수 이름에 하이픈을 지원하려면 다음을 수행하세요.

  • Bourne 쉘 및 ksh88 및 bosh와 같은 파생 제품(Bourne 쉘에서는 함수와 변수가 동일한 네임스페이스를 공유하므로 변수와 함수가 동일한 이름을 가질 수 없습니다).
  • ksh93, yash, 원래 ash 및 일부 파생물(busybox ash(sh의 기본 선택), 대시)

결론

  • 하이픈은 비표준입니다. 쉘 간 호환성을 원한다면 멀리하십시오.
  • 하이픈 대신 밑줄을 사용하세요. 밑줄은 어디에서나 허용됩니다.

답변2

정말 늦었다는 걸 알지만 밑줄에 대한 접근성을 높이는 문제를 해결할 수 있을 것입니다.

xmodmap -e "keycode  20 =  underscore minus"

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

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

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

관련 정보