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 s
funcionan ember s
y 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, --active
debería "establecer la última pestaña especificada como activa en su ventana", pero cd
no 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 myproject
fuera una función. Éste es un "problema" secundario. Puedes ceñirte al alias si quieres.
El problema principal es que esperas cd ~/code/myproject-ember
trabajar en la pestaña recién abierta. Cuando su alias se reemplaza myproject
con
… gnome-terminal --tab --active && cd ~/code/myproject-ember
y este código se ejecuta, el hecho de que gnome-terminal
se ejecute no inyectará el siguiente comando ( cd ~/code/myproject-ember
) en una línea de comandoallá. cd
se ejecutará en el shell actual después de que este gnome-terminal
proceso en particular finalice exitosamente. El fragmento completo es similar a:
… true && cd …
y no hay ninguna razón por la que esto cd
deba 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. Luegognome-terminal
recibe la cadenacd ~/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
cd
de esta manera no tiene sentido.cd …
no se ejecuta en un shell; esto requiere uncd
ejecutable separado, puede que lo tengas o no en tu sistema operativo. Incluso si lo tuviera e incluso si la tilde estuviera expandida,gnome-terminal
ejecutaríacd
eso 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-terminal
un shell interactivo en algún directorio esaquí:
gnome-terminal --working-directory=/path/to/dir
De manera similar a antes, gnome-terminal
no se expandirá ~
si lo obtiene después --working-directory=
. Mejor uso $HOME
y 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, $HOME
se 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 rails
y ember
se 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).