Intentando crear una función bash simple pero aparece el error de sintaxis cerca del error inesperado del token `('

Intentando crear una función bash simple pero aparece el error de sintaxis cerca del error inesperado del token `('

Estoy intentando modificar mi .bash_profile que actualmente se ve así:

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

sin embargo, cuando intento :wq y source .bash_profile (en una terminal mac os x), aparece el siguiente mensaje de error:

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

un colega también probó lo mismo (en una terminal iterm) y pudo ejecutar la función sin errores

¿Alguna idea de qué podría estar haciendo mal?

Respuesta1

Hipótesis: en su caparazón (pero no en el de su colega) gcredshay unaliasdefinido antes de que se analice la línea problemática.

La expansión de alias ocurre temprano y es puramente textual (es decir,gcreds cadenaes reemplazado por algunoscadena, no hay lógica ahí). Su definición de la función deja de ser válida, probablemente porque ()no está después de la primera palabra. Por ejemplo, si gcredsfuera reemplazado por gcreds --somethingentonces sería:

gcreds --something () { …

que no es una definición sintácticamente válida de una función. Pero es posible que gcredssea reemplazado por otra cosa:

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

No importa cuál sea el reemplazo. El hecho ()de que ahora esté en el lugar equivocado importa.

En Bash puedes correr type gcredspara ver qué gcredses realmente. Pruebe también type -a gcreds(y help typeaprenda qué -ahace).

Puede definir una función de forma alternativa, sin ():

function gcreds { …

Esta sintaxis esno portátil. Entiendo que lo usarás dentro ~/.bash_profilede un archivo específico de Bash, así que está bien.

Ahora la primera palabra es function. Supongo que no tiene alias y se interpreta como una palabra clave (verifique type function). Si es así, el gcredsalias no se expande cuando se analiza la definición y no puede romper la definición. De esta manera puedes definir una función llamada gcreds, incluso si ya existe un gcredsalias.

Supongamos que logra definir gcredsalias y gcredsfunción. Ahora, si ejecuta gcreds foo bary su alias se reemplaza gcredscon gcreds …, el alias se expandirá primero y la función se ejecutará más tarde. Pero si su alias se reemplaza gcredscon, something-else-than-gcreds …entonces el alias se expandirá primero, la función no importará (una función nombrada something-else-than-gcredssí importaría, si corresponde).

Probablemente no necesites un aliasyuna función con el mismo nombre. Elegir uno. Si necesita ambos, defina primero la función y luego el alias; o utilice la palabra clave functioncomo se muestra arriba.

información relacionada