Cómo crear un alias complejo (iniciar Ember, iniciar Rails y cambiar de directorio) en Ubuntu 20.10.4

Cómo crear un alias complejo (iniciar Ember, iniciar Rails y cambiar de directorio) en Ubuntu 20.10.4

Me gustaría usar un alias para iniciar mi aplicación Rails/Ember, abrir una nueva pestaña de terminal y acceder al directorio de Ember. Utilizo Ubuntu 20.10.4 y la Terminal predeterminada. Esto es lo que tengo hasta ahora:

alias myproject='cd ~/code/myproject-rails && rails s & cd ~/code/myproject-ember && ember s & gnome-terminal --tab --active && cd ~/code/myproject-ember'

Esto funciona parcialmente: ambos rails sfuncionan ember sy puedo abrir la aplicación en el navegador. También se abre una nueva pestaña, pero en mi directorio de inicio. De acuerdo con lapaginas man, --activedebería "establecer la última pestaña especificada como activa en su ventana", pero cdno se ejecuta (en esta pestaña).

¿Que esta mal aquí? Cuando lo uso gnome-terminal --tab -e "cd ~/code/myproject-ember"en su lugar, aparece un mensaje de error.El fichero o directorio no existe.

Respuesta1

Por favor leeEn Bash, ¿cuándo crear un alias, cuándo crear un script y cuándo escribir una función?

Alias ​​es un reemplazo puramente textual. Su alias inyecta tanto código que sería más elegante si myprojectfuera una función. Éste es un "problema" secundario. Puedes ceñirte al alias si quieres.

El problema principal es que esperas cd ~/code/myproject-embertrabajar en la pestaña recién abierta. Cuando su alias se reemplaza myprojectcon

… gnome-terminal --tab --active && cd ~/code/myproject-ember

y este código se ejecuta, el hecho de que gnome-terminalse ejecute no inyectará el siguiente comando ( cd ~/code/myproject-ember) en una línea de comandoallá. cdse ejecutará en el shell actual después de que este gnome-terminalproceso en particular finalice exitosamente. El fragmento completo es similar a:

… true && cd …

y no hay ninguna razón por la que esto cddeba realizarse en otro lugar que no sea el shell que ejecuta el comando completo.

Su intento gnome-terminal --tab -e "cd ~/code/myproject-ember"falla porque:

  • ~nunca se expande. Entiendo que la tilde está entre comillas simples cuando defines el alias. Luego, después de la expansión del alias, esentre comillas dobles. Luego gnome-terminalrecibe la cadena cd ~/code/myproject-ember, la divide en palabras (sin expandir la tilde) e intenta ejecutar el comando resultante, pero no en un shell (que de otro modo finalmente podría expandir la tilde).
  • Correr cdde esta manera no tiene sentido. cd …no se ejecuta en un shell; esto requiere uncdejecutable separado, puede que lo tengas o no en tu sistema operativo. Incluso si lo tuviera e incluso si la tilde estuviera expandida, gnome-terminalejecutaría cdeso haría su trabajo inútil (cambiaría su propio directorio) y saldría; y no habría nada más que hacer en esta pestaña.

La forma correcta de iniciar gnome-terminalun shell interactivo en algún directorio esaquí:

gnome-terminal --working-directory=/path/to/dir

De manera similar a antes, gnome-terminalno se expandirá ~si lo obtiene después --working-directory=. Mejor uso $HOMEy asegúrese de que esté expandido por su shell actual. Si elige utilizar un alias, puede ser:

alias myproject='cd ~/code/myproject-rails && rails s & cd ~/code/myproject-ember && ember s & gnome-terminal --tab --active "--working-directory=$HOME/code/myproject-ember"'

En este caso, $HOMEse expandirá después de cada expansión de alias.

Como dije, en mi opinión una función sería más elegante:

unalias myproject
myproject () {
   cd ~/code/myproject-rails && rails s &
   cd ~/code/myproject-ember && ember s &
   gnome-terminal --tab --active "--working-directory=$HOME/code/myproject-ember"
}

Nota railsy emberse convertirán en trabajos en elviejocaparazón. No se cuales son perotal vezle gustaría tenerlos como trabajos en el nuevo shell. Se puede hacer, pero no daré más detalles aquí. (Si lo necesita y no encuentra una solución, haga una pregunta por separado).

información relacionada