
bash 스크립트에서 "@" 기호를 함수 이름으로 사용할 수 있습니까? 다음은 작동하지 않습니다:
function @() {
echo hello
}
답변1
에서man bash
name A word consisting only of alphanumeric characters and underscores,
and beginning with an alphabetic character or an underscore. Also
referred to as an identifier.
Shell functions are declared as follows:
name () compound-command [redirection]
function name [()] compound-command [redirection]
답변2
편집 2:바닐라 bash에서는 문제가 없지만 다음 과 같은 @
경우 패턴 그룹화 연산자로 사용됩니다.extglob 쉘 옵션설정되면 echo @()
특정 조건에서 쉘을 걸 수 있습니다. 더 많은 이유가 있습니다.@
식별자로 사용하지 않음`.
편집 1:명확히 하자면 식별자 정의에 따라 허용되지 않습니다. 나는 그것을 추천하지 않습니다. 나는 단지 이전 버전과의 호환성을 위해 그렇게 말하는 것입니다.가능한@
bash에서 식별자로 사용합니다 .
@() { echo "$1 world"; }
@ hello
alias @="echo hello"
@ world
@
특수 매개변수( $@
) 및 배열( ${arr[@]}
)로 사용되지만 다른 곳에서는 사용되지 않습니다. Bash는 변수 이름이 아닌 별칭 및 함수와 같은 식별자에 사용하는 것을 중단하지 않습니다.
어떤 사람들은 별칭을 @
로 지정하여 sudo
로 명령을 실행할 수 있습니다 @ apt-get install
.
내가 쉘 식별자로 사용하지 않는 주된 이유는 @
내가 쉘 식별자에 너무 익숙하기 때문입니다.@
Makefile 의 의미부작용 없이 명령을 침묵시킵니다.
참고: zsh에서도 동일하게 작동합니다.
답변3
함수 이름 지정은 별칭에 허용되는 문자와 매우 유사합니다.
From man bash
:
/, $, ` 및 = 문자와 위에 나열된 셸 메타 문자 또는 인용 문자는 별칭 이름에 표시되지 않을 수 있습니다.
메타문자
다음 중 하나: | & ; ( ) < > 스페이스 탭
따라서 다음을 제외하고: / $ ` = | & ; ( ) < > 스페이스 탭
다른 문자는 별칭 및 함수 이름에 유효해야 합니다.
그러나 이 문자는 extglob이 활성화된 경우 @
에도 사용됩니다 . @(pattern-list)
기본적으로 extglob은 대화형 쉘에서 활성화됩니다.
따라서 이는 실패해야 합니다.
$ @(){ echo "hello"; }
bash: syntax error near unexpected token `}'
그러나 이것은 작동합니다:
$ bash -c '@(){ echo "hello"; }; @'
hello
그리고 이것은 또한 작동할 것입니다:
$ shopt -u extglob ### keep this as an independent line.
$ @(){ echo "hello"; }
$ @
hello
다음과 같은 작업도 가능합니다.
$ f(){ echo "yes"; }
$ alias @=f
$ @
yes
별명은 허용되는 기호가 유연합니다.