0 votos

zsh alias no siempre acepta argumentos

Tengo los siguientes alias en mi configuración zsh:

alias artisan='[ -f vendor/bin/sail ] && sail artisan || php artisan'
alias sail='[ -f sail ] && bash sail || bash vendor/bin/sail'
alias dep='[ -f dep ] && dep || vendor/bin/dep'

En sail y dep Los alias funcionan como se espera. Por ejemplo, puedo escribir sail up o dep deploy y los argumentos ( up , deploy ) al comando de alias.

Sin embargo, para artisan este no es el caso. Siempre obtengo la página de ayuda por defecto que se muestra cuando no se proporciona ningún argumento. ¿Por qué ocurre esto?

3voto

Mikhail Morfikov Puntos 356

Un alias es una simple sustitución de texto, por lo que el comando artisan up se ampliará a esto:

[ -f vendor/bin/sail ] && sail artisan || php artisan up

En up es sólo al final. Si el vendor/bin/sail existe, el archivo sail artisan se ejecutará sin ningún otro parámetro. Si el archivo no existe, el comando después de || se ejecutará - ya que está al final, obtendrá up pasado como parámetro. Eso es probablemente lo que ocurrió en las situaciones en las que el alias funcionó.

Para pasar argumentos a un comando, puede utilizar una función:

artisan() {
  if [ -f vendor/bin/sail ]; then
    sail artisan "$@"
  else
    php artisan "$@"
  fi
}

"$@" se expandirá a los parámetros de la invocación de la función, es decir, con artisan up pasará up a cualquiera de los comandos.

Tenga en cuenta que este ejemplo utiliza un if-else declaración. Aunque [ condition ] && cmd1 || cmd2 parece una sentencia ternaria, en realidad no lo es: si la condición se evalúa como verdadera y cmd1 sale con un código de retorno distinto de cero, cmd2 también se ejecutará. La mayoría de las veces es un comportamiento inesperado.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X