내 테스트(Bash 및 Z Shell)에서 이름에 하이픈이 포함된 함수, 별칭 또는 실행 가능한 쉘 스크립트를 정의하는 데 문제가 없다는 것을 발견했지만 이것이 모든 쉘과 모든 사용 사례에서 괜찮은지 확신할 수 없습니다. .
내가 이렇게 하고 싶은 이유는 하이픈이 밑줄보다 입력하기 쉽고 따라서 더 빠르고 부드럽기 때문입니다.
이것이 문제가 되지 않는다고 믿기가 꺼려지는 한 가지 이유는 일부 언어(예: Ruby)에서는 하이픈 주위에 공백이 없어도 마이너스 기호로 해석되기 때문입니다. 하이픈이 공백 없이도 옵션을 의미하는 것으로 해석되는 일부 쉘에서 비슷한 일이 발생하더라도 놀라지 않을 것입니다.
제가 약간 회의적인 또 다른 이유는 제 텍스트 편집기가 하이픈이 있는 함수의 구문 강조를 엉망으로 만들기 때문입니다. (물론 이는 쉘 스크립트의 구문 강조 구성에 있는 버그일 가능성이 높습니다.)
하이픈을 사용하지 말아야 할 이유가 있나요?
답변1
POSIX 및 하이픈: 보장되지 않음
POSIX 표준에 따르면,기능 이름유효한 이름이어야 하며이름다음을 포함할 수 있습니다:
3.231 이름
쉘 명령 언어에서 밑줄, 숫자, 이식 가능한 문자 집합의 문자로만 구성된 단어입니다. 이름의 첫 번째 문자는 숫자가 아닙니다.
또한,별명유효해야 합니다별명, 여기에는 다음이 포함될 수 있습니다.
3.10 별칭
쉘 명령 언어에서 밑줄, 숫자, 이식 가능한 문자 집합의 문자와 "!", "%", ",", "@" 문자로만 구성된 단어입니다.구현에서는 별칭의 추가 문자를 확장자로 허용할 수 있습니다. (강조합니다.)
하이픈은아니요두 경우 모두 허용되어야 하는 문자를 나열하십시오. 따라서 사용시 이식성이 보장되지 않습니다.
하이픈을 지원하지 않는 쉘의 예
dash
/bin/sh
함수 이름에 하이픈을 지원하지 않는 debian-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 셸(ash 기반 셸만 해당)도 함수 이름에 하이픈을 지원하지 않습니다.
$ a-b() { date; }
-sh: Syntax error: Bad function name
쉘 지원 하이픈 요약
다음 쉘은 함수 이름에 하이픈을 지원하는 것으로 알려져 있습니다.
- pdksh 및 그 파생물, bash, zsh
- FreeBSD의 sh(2010년부터) 또는 NetBSD(2016년부터).
- busybox sh는 컴파일할 때 선택된 쉘
hush
이 아닙니다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입니다. 사용해야 하는 키 코드를 찾는 데 도움이 필요하면 알려주시기 바랍니다.