이 없으면 ()구문이 실제로 모호합니다.
있을하는 일부 기능을 정의하기위한 명백한 구문을 실질적으로 변경하지 않고 다른 쉘 구문,이 수 없습니다
do_something {
# one or more commands go here
}
당신은 이것이 "현재 구문에 맞지 않는다"고 말했지만 그렇지 않습니다! 첫 줄 을 실행할 때 어떤 종류의 구문 오류도 발생하지 않습니다 . 오류가 발생하지만 구문에 대한 오류는 아닙니다. 이있는 두 번째 줄 }은 구문 오류이지만 첫 번째 줄은 그렇지 않습니다. 대신, do_something {호출 된 명령을 실행하고 해당 명령의 인수로 do_something전달 하려고 시도합니다 {.
$ do_something {
do_something: command not found
이미라는 명령이 있으면 do_something실행 중입니다. 이미라는 함수가 있다면 do_something, 당신은 그것을 요구하고있다 . 일반적으로 구문은 분명해야하지만, 실수로 함수를 호출하지 않고도 함수를 재정의 할 수 있어야합니다. 함수를 정의하고 호출하면 동일하게 보이지 않아야합니다.
쉘이 취급하는 방법 {및 (.
으로 type {당신을 말할 것이다, {쉘 키워드입니다. 이것은 그것을 좋아 [[합니다. 명령이 아닌 상황에서 사용되는 경우 {특수 의미를 갖습니다. 특히 명령 그룹화를 수행합니다. 그러나 다른 상황에서는 이스케이프 처리되어 리터럴 {문자 를 나타낼 수 있습니다 . 여기에는 명령의 두 번째 또는 후속 단어로 전달하는 상황이 포함됩니다.
물론 Bash 는{ 현재와 다르게 취급하도록 설계되었을 수 있습니다 . 그러나이 구문은 더 이상 POSIX 셸과 호환되지 않았으며 Bash는 실제로 Bourne 스타일 셸이 아니므로 많은 셸 스크립트를 실행할 수 없습니다.
반대로 (쉘 메타 문자입니다. 그것은 항상 명령에 나타나고 인용되지 않은 경우 특수 처리 (함께 ' ', " "또는 \). 따라서 구문에는 모호성이 없습니다.
do_something() {
# one or more commands go here
}
그것은 다른 것을 의미 할 수 없습니다. Bash에 함수가 없다면 구문 오류 일 것입니다. 같은 이유로 echo foo(bar)구문 오류가 있습니다.
()표기법을 정말로 싫어한다면 sudodus에서 언급했듯이 키워드를 사용 function하고 생략 할 수 있습니다 . 이것은 대부분의 다른 Bourne 스타일 쉘에서 함수를 정의하기위한 구문의 일부 가 아니며 , 일부에서는 지원되지만 다른 방식으로 정의 된 함수는이를 의미 하므로이를 사용하는 스크립트는 이식성이 없습니다. (이 구문이 모호하지 않은 이유 는 그 자체가 Bash의 키워드이기 때문에 뒤에 오는 것이 함수 정의의 시작임을 나타냅니다.)function
마지막으로 대부분의 함수 정의 {는 실제로 사용 되지만 모든 복합 명령이 허용됩니다. 본문이 항상 서브 쉘에서 실행되기를 원하는 함수가있는 경우 ( )보다 사용할 수 있습니다 { }.