Abrir múltiples pestañas de terminal y ejecutar el comando

9

Necesito abrir varias pestañas de terminal, darles títulos, ir a un directorio y hacer que cada pestaña ejecute un comando.

Soy nuevo en Linux y scripts de shell, después de buscar en línea y verificar algunas soluciones, hice este script ( EDITADO en base a las respuestas a continuación):

#!/bin/bash

cd /media/Extra/Project

tab=" --tab-with-profile=Default"
options=(--tab --title=Terminal)

cmds[1]="'rails s'"
titles[1]="Server"

cmds[2]="'rails c'"
titles[2]="Console"


for i in 1 2; do
  options+=($tab --title="${titles[i]}"  -e "bash -c \"${cmds[i]} ; bash\"" )          
done

gnome-terminal "${options[@]}"


exit 0

Abre las pestañas, las nombra, pero no puede ejecutar los comandos que generan este error:

Se produjo un error al crear el proceso secundario para este terminal

Otra deficiencia es que si detuve el comando en ejecución, cierra la pestaña, lo que no quiero. Necesito poder detener el comando y ejecutarlo nuevamente dentro de la misma pestaña.

¿Qué tiene de malo el guión? ¿Hay otra forma más simple de hacer eso?

Nota: Si eliminé la parte (-e "\" bash -c $ {cmds [i]}; bash \ "") del comando, se abren las pestañas en el directorio dado y se nombran, sin errores.

-Editar-1:

Después de aplicar la respuesta @Tuknutx a continuación y editar el script, el error ya no aparece, pero me da bash: rails c: command not foundy rails screa una nueva aplicación de rails en lugar de iniciar el servidor de rails, estoy usando .rmvrc para seleccionar un conjunto de gemas una vez que se accede a esta carpeta .

Brary
fuente
Si desea hacer que su script se ejecute en su arranque de ubuntu: - puede ejecutar su script como un servicio inicial ( help.ubuntu.com/community/UbuntuBootupHowto ) o: usando "aplicaciones de inicio" en su entorno de escritorio
Aboelnour
si lo escribo cmds[1]="'ping 192.168.9.9'"me da el mismo error pero lo resolví eliminando la comilla simple. Entonces, si escribo cmds[1]="ping 192.168.9.9", funciona.
margarita
@Brary pero no entiendo por qué abre tres pestañas, una predeterminada y otras dos que se configuran en el script. Porque definimos tab=" --tab-with-profile=Default"??
margarita

Respuestas:

3

¡Recomendaría usar tmuxcon tmuxinator, hará el trabajo por usted, y también puede confiar en los terminatordiseños!

Para ver la terminatordistribución del diseño, la respuesta de mhnagaoka aquí también pregunta aububuntu:

  1. Después de configurar su diseño, haga clic derecho en cualquier fondo de terminal y elija Preferencias → pestaña Diseños y haga clic en el botón Agregar .

  2. Dale un nombre y presiona Cerrar .

  3. Esto debería crear el ~/.config/terminator/configarchivo mencionado .

  4. Ahora puede iniciar el terminador usando el diseño guardado usando: terminator -l yourLayout(reemplace su diseño con lo que elija en el paso 2).

  5. (opcional) Edite el ~/.config/terminator/configarchivo de modo que donde dice [layouts]y anidado debajo de él [[yourLayout]], cambie el nombre de su diseño a predeterminado y elimine / cambie el nombre del diseño predeterminado anterior . Ahora, cuando Terminator se inicia sin ningún parámetro, cargará su [[default]]diseño personalizado .

Islam Azab
fuente
2

Para resumir algunas de las otras respuestas y sus comentarios, esto es lo que terminé con:

#!/bin/bash

cd /path/of/my/stuff

tab=" --tab"
options=()

cmds[1]="echo Banana"

cmds[2]="echo Cat"


for i in 1 2; do
options+=($tab -e "bash -c '${cmds[i]} ; bash'" )
done

gnome-terminal "${options[@]}"

exit 0

Tenga en cuenta que quité la pestaña 'maestro' y los perfiles y los títulos (que parecen estar en desuso gnome-terminal).

Ian Hincks
fuente
La salida de $tab -e... Option “-e” is deprecated and might be removed in a later version of gnome-terminal."Use" - "para terminar las opciones y poner la línea de comando para ejecutar después. . that's an output but the comands get executed. When i use $ tab - `el comando no se ejecuta y el terminal muestra dsis:There was an error creating the child process for this terminal. Failed to execute child process “bash -c 'echo Banana ; bash'” (No such file or directory)
nyxee
1

Prueba esto:

options+=($tab --title="${titles[i]}"  -e "bash -c \"${cmds[i]} ; bash\"" ) 

de lo contrario, la expresión completa después de -e se interpretará como el comando.

Para incluir alias de .bashrc use en -iclugar dec

TuKsn
fuente
El error ya no aparece, gracias. Pero me da bash: rails c: command not foundy 'rails s' crea una nueva aplicación de rails en lugar de iniciar el servidor de rails. Esto cambia el alcance de la pregunta, la
editaré
¿Funcionó si intentas rails cen una terminal sin nada más? Tal vez debería ser rails -c?
TuKsn
Intenté que no funcionó. Incluso lo intenté rvm list gemsetsy dice No command 'rvm' found... ¡ejecuta el mismo comando rvm list gemsetsen la primera pestaña que se abre sin ejecutar un comando y funcionó! ¿ejecuta el comando antes de que se cargue el entorno y se cargue el archivo .rvmrc?
Brary
1

El argumento que le está dando a la opción -e "bash -c command; bash"incluye las comillas. ¡Interpreta toda esa cadena como el nombre de un comando! Tal vez puedas probar: -e "bash -c 'command ; bash'". De esta manera, lo que se ejecuta en la ventana de su terminal es command, y después de que se ejecuta, se le da un shell de hija, que supongo que es lo que desea. Por cierto, también puedes decir 'command & bash'; Esto ejecutará el comando en segundo plano y le dará el shell hija de inmediato.

Silvio Levy
fuente
He cambiado esto options+=($tab --title="${titles[i]}" -e "\"bash -c ${cmds[i]} ;bash\"" )en options+=($tab --title="${titles[i]}" -e "\"bash -c '${cmds[i]} ;bash'\"" )y me dio el mismo error .. estoy haciendo las cosas bien?
Brary
No del todo correcto: elimine \ "antes del primer bash y \" después del 'después del segundo bash.
Silvio Levy
Gracias, edité la pregunta y cambié su alcance para incluir rieles y rvm.
Brary