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:바닐라 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

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

관련 정보