간단한 bash 함수를 만들려고 하는데 예상치 못한 토큰 `(' 오류 근처에서 구문 오류가 발생합니다.

간단한 bash 함수를 만들려고 하는데 예상치 못한 토큰 `(' 오류 근처에서 구문 오류가 발생합니다.

현재 다음과 같은 .bash_profile을 수정하려고 합니다.

alias kx="kubectx"
gcreds () {
gcloud container clusters get-credentials $1 --zone $2;
}

그러나 내가 :wq 및 source .bash_profile(mac OS X 터미널에서)을 시도하면 다음과 같은 오류 메시지가 나타납니다.

bash: .bash_profile: line 14: syntax error near unexpected token `('
-bash: .bash_profile: line 14: `gcreds (){'

동료도 iterm 터미널에서 동일한 테스트를 했고 오류 없이 기능을 실행할 수 있었습니다.

내가 뭘 잘못하고 있을지도 모르지?

답변1

가설: 당신의(동료의 쉘은 아님) 쉘 gcreds에는별명문제가 있는 라인이 파싱되기 전에 정의됩니다.

별칭 확장은 초기에 발생하며 순전히 텍스트입니다(예:gcreds 일부로 대체됨, 거기에는 논리가 없습니다). 함수 정의가 유효하지 않게 됩니다. 아마도 ()첫 번째 단어 이후에 가 없기 때문일 것입니다. 예를 들어 then gcreds으로 대체된 경우 gcreds --something다음과 같습니다.

gcreds --something () { …

이는 구문적으로 유효한 함수 정의가 아닙니다. 하지만 gcreds다른 것으로 대체 될 수도 있습니다 .

something-else-than-gcreds whatever and more () { …

대체품이 무엇인지는 중요하지 않습니다. 사실은 ()이제 잘못된 위치에 있습니다.

Bash에서는 실행하여 실제로 type gcreds무엇이 있는지 확인할 수 있습니다 gcreds. 또한 시도해보세요 type -a gcreds(그리고 help type무엇을 하는지 알아보세요 -a).

다음을 사용하지 않고 다른 방법으로 함수를 정의할 수 있습니다 ().

function gcreds { …

이 구문은휴대용이 아니다. Bash 전용 파일인 내부에서 사용할 것이라는 점을 이해하므로 ~/.bash_profile괜찮습니다.

이제 첫 번째 단어는 입니다 function. 나는 그것이 별칭이 아니며 키워드로 해석된다고 가정합니다 (check type function). 그렇다면 gcreds정의를 구문 분석할 때 별칭이 확장되지 않으므로 정의를 중단할 수 없습니다. 이 방법으로 gcreds이미 별칭이 있더라도 이라는 함수를 정의할 수 있습니다 gcreds.

gcreds별칭과 함수를 정의했다고 가정해 보겠습니다 gcreds. 이제 실행 gcreds foo bar하고 별칭을 다음 gcreds으로 바꾸면 gcreds …별칭이 먼저 확장되고 함수는 나중에 실행됩니다. 그러나 별칭이 다음 gcreds으로 대체되면 something-else-than-gcreds …별칭이 먼저 확장되고 함수는 중요하지 않습니다( something-else-than-gcreds있는 경우 이름이 지정된 함수가 중요함).

별칭이 필요하지 않을 수도 있습니다.그리고같은 이름의 함수입니다. 하나를 선택. 둘 다 필요하다면 함수를 먼저 정의하고 별칭은 나중에 정의하세요. 또는 function위에 표시된 키워드를 사용하세요 .

관련 정보