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:@
바닐라 배쉬에서는 문제가 없지만 ,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
별칭은 허용되는 기호가 유연합니다.