bash 함수 이름으로 "@"를 사용하십시오.

bash 함수 이름으로 "@"를 사용하십시오.

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

별칭은 허용되는 기호가 유연합니다.

관련 정보