
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) gcreds
hay 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 gcreds
fuera reemplazado por gcreds --something
entonces sería:
gcreds --something () { …
que no es una definición sintácticamente válida de una función. Pero es posible que gcreds
sea 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 gcreds
para ver qué gcreds
es realmente. Pruebe también type -a gcreds
(y help type
aprenda qué -a
hace).
Puede definir una función de forma alternativa, sin ()
:
function gcreds { …
Esta sintaxis esno portátil. Entiendo que lo usarás dentro ~/.bash_profile
de 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 gcreds
alias 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 gcreds
alias.
Supongamos que logra definir gcreds
alias y gcreds
función. Ahora, si ejecuta gcreds foo bar
y su alias se reemplaza gcreds
con gcreds …
, el alias se expandirá primero y la función se ejecutará más tarde. Pero si su alias se reemplaza gcreds
con, something-else-than-gcreds …
entonces el alias se expandirá primero, la función no importará (una función nombrada something-else-than-gcreds
sí 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 function
como se muestra arriba.