¿Cómo puedo hacer un script que abra ventanas de terminal y ejecute comandos en ellas?

140

Tengo tres scripts que necesito ejecutar cuando inicio mi máquina Ubuntu, comienzan los servicios que uso en mi entorno de desarrollo.

Para hacer eso, abro manualmente tres terminales y escribo los comandos.

¿Hay alguna forma de crear un script que abra tres terminales y ejecute un comando en cada uno de estos? (Cada comando debe estar en una ventana de terminal separada para que pueda ver su salida).

JSBach
fuente

Respuestas:

138
gnome-terminal -e command

o

xterm -e command

o

konsole -e command

Mas o menos

terminal -e command

Para hacer que la terminal se quede cuando el comando sale:

En konsole hay una --noclosebandera.

En xterm, hay una -holdbandera.

En gnome-terminal, vaya a Editar -> Preferencias de perfil -> Título . Haz clic en la pestaña Comando . Seleccione Hold the terminal en el menú desplegable etiquetado Cuando sale el comando . Debería crear un nuevo perfil para eso y ejecutar con

gnome-terminal --window-with-profile = NAMEOFTHEPROFILE -e comando
nickguletskii
fuente
1
Si trato de mantener el terminal, obtengo "el proceso hijo salió normalmente con el código de estado 127"
Darshan Chaudhary
2
gnome-terminal ya no tiene la opción de título :(
törzsmókus
1
@ törzsmókus es 2017 de hecho! Los lanzamientos de LTS tienen una vida útil de 5 años. 14.04 no termina hasta abril de 2019. wiki.ubuntu.com/Releases
bhass1
1
gnome-terminal -e commandsolo funciona si commandse cita. Así que esto no funciona: gnome-terminal -e "echo hello world; sleep 3"pero esto hace: gnome-terminal -e "bash -c 'echo hello world; sleep 3'". Suspiro.
bgoodr
3
También puede mantener abierto el terminal gnome agregando ; $SHELLal final del comando. Ej:gnome-terminal --tab --title="test" --command="bash -c 'cd /etc; ls; $SHELL'"
Gabriel Staples
58

En lugar de codificar gnome-terminal, konsoleetc., utilice el sistema Alternativas. El programa que ejecuta el emulador de terminal predeterminado es:

x-terminal-emulator

En mi sistema, abre una nueva instancia de Konsole cada vez que ejecuto este comando.

Afortunadamente, los terminales parecen admitir la -eopción de ejecutar un comando (lo verifiqué para konsoley gnome-terminal). Los argumentos después del comando se pasan al comando invocado. Bash se niega a permanecer abierto en mi terminal, se necesita un script adicional para obtener un terminal:

#!/bin/sh
"$@"
exec "$SHELL"

Si guardó el script anterior como /home/user/hackyy lo hizo ejecutable, ejecutaría sus scripts con:

x-terminal-emulator -e /home/user/hacky your-script optional arguments here

Se requiere la ruta completa y /home/user/hackydebe ser ejecutable.

Mi intento anterior de ejecutar un script en una nueva ventana de terminal se puede encontrar en la revisión # 2 , fue antes de darme cuenta de que se pueden pasar los argumentos x-terminal-emulator.

Lekensteyn
fuente
En este caso, no ayudará mucho, ya que el autor de la pregunta quiere hacer algo que no sea igual para todas las terminales.
nickguletskii
Intento n. ° 3: este debe mantener el terminal abierto y ejecutar el programa con argumentos opcionales.
Lekensteyn
1
Usé la opción gnome, sin embargo, una vez que ejecuto mi script, ¡el terminal principal se cierra! .. alguna idea de por qué?
McLan
3
@ Suda.nese Eso es por diseño, cuando el "terminal" termine de ejecutar el script, se cerrará porque no hay nada más que hacer. Puede "arreglar" esto invocando un shell donde puede ejecutar comandos ( bash) o tener una línea como read -p "Press Return to continue".
Lekensteyn
1
¿Cómo puedes ejecutar más de un comando en la terminal? Por ejemplo cd xxx && start.sh. El intérprete ve el && como la segunda parte del comando (lo cual es lógico), pero si lo cito, entonces trata de ejecutar todo como un gran argumento
Richard
9

Muy simple-

#!/bin/bash

/etc/init.d/ccpd status

Esto es suficiente para otros comandos que no necesitan mostrar nada en la terminal. Pero aquí hay que ver el estado que se muestra.
Por lo tanto, debe ejecutarse en una ventana de terminal

#!/bin/bash

gnome-terminal -e "/etc/init.d/ccpd status"  --window-with-profile=NAMEOFTHEPROFILE

La otra publicación pretende []ser un marcador de posición

Aquí "NAMEOFTHEPROFILE" debe reemplazarse con el nombre del perfil que "contiene el terminal cuando sale el comando".

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Karthik T
fuente
1
@cipricus, creo que []era solo marcador de posición
Karthik T
Entendido. pero tengo que hacer que la terminal no se cierre tan rápido. Supongo que eso también está en la pregunta vinculada
@cipricus, ¿has probado el perfil? Solo necesito agregar --window-with-profile=NAMEOFTHEPROFILEa lo que he dado
Karthik T
1
@cipricus Tendría que volver a casa para dar mejores instrucciones, pero la idea es crear un perfil especial con esa opción establecida y usar el nombre del perfil especial en el lugar anterior.
Karthik T
2
@cipricus si eso es suficiente para ti, entonces está bien. El perfil no es más que un grupo de configuraciones. Puede configurar los ajustes SOLAMENTE para usarlos en su script, y no tiene que usarlos en todos los terminales. Puede ver Editar -> Perfiles para ver todos los perfiles que tiene, y agregaría uno allí que se configuró como se explica en la publicación que vinculó
Karthik T
5

Ayudado por la respuesta de @ nickguletskii , y mi propio comentario debajo de su respuesta, e inspirado por el voto de @ grabantot de mi comentario, esta es mi forma preferida de hacerlo, especialmente cuando quiero que el terminal permanezca abierto para que luego pueda usarlo manualmente.

Ex. uso: esto es realmente útil para agregar a sus programas de inicio para que este script se ejecute, abra un terminal, cree y nombre una pestaña en el terminal y ejecute un comando para usted. O bien, simplemente puede agregar un enlace simbólico a este script en su escritorio. Utilizo este tipo de enfoque para poder hacer doble clic en un solo icono en mi escritorio y hacer que abra un montón de terminales (con varias pestañas nombradas de acuerdo con el trabajo que voy a hacer en ellas) y programas para configurar mi entorno de programación, por ejemplo, para el trabajo diario.

Aquí hay un ejemplo artificial, que abre una sola pestaña, la titula "prueba", luego ejecuta el comando simple cd /etc; lsdentro de ella. La $SHELLparte al final obliga al shell a permanecer abierto para que pueda ver su salida y continuar usándolo (aprendí esto en otro lugar en Stack Overflow):

gnome-terminal --tab --title="test" --command="bash -c 'cd /etc; ls; $SHELL'"

Aquí hay un ejemplo más complicado que abre 3 pestañas separadas en el mismo terminal gnome. Este es exactamente el tipo de cosas que hace el acceso directo de mi escritorio para que pueda abrir un montón de ventanas de programación a la vez:

gnome-terminal --tab --title="tab 1" --command="bash -c 'cd /etc; ls; $SHELL'" --tab --title="tab 2" --command="bash -c 'cd ~; ls; $SHELL'" --tab --title="tab 3" --command="bash -c 'cd ~/temp3; ls; $SHELL'"

Aquí hay un desglose de ese comando anterior:

  • gnome-terminal = abrir un terminal gnomo
  • --tab = abre una pestaña única para lo que viene después
  • --title="tab 1" = título de esta pestaña "pestaña 1"
  • --command="bash -c 'cd /etc; ls; $SHELL'"= ejecuta el bash -c 'cd /etc; ls; $SHELL'comando, que es un comando que acabo de inventar como ejemplo; esto es lo que hace:
    • bash -c dice que es un bash 'c'ommand
    • cd /etc = 'c'hange' d'irectory en la ruta "/ etc"
    • ls = 'No contiene el contenido de este directorio
    • $SHELL= este tidbit críptico es necesario para mantener abierto el shell para que pueda trabajar con él. Si desea que se abra el shell, ejecute su comando, luego cierre, simplemente elimine esta parte. Sin embargo, quiero que la pestaña permanezca abierta para poder hacer que la programación sea mágica. :)
  • luego comenzamos de nuevo en la --tabparte para producir la pestaña 2, luego otra vez para la pestaña 3. Personalice a su gusto.

Captura de pantalla:

ingrese la descripción de la imagen aquí

Gabriel Staples
fuente
1
me alegro de haber sido útil) También tengo scripts en los que puedo hacer clic y comenzar a trabajar en el proyecto. Hubo dos problemas con ellos: muchas ventanas de terminal (tenían una pantalla completamente separada para ellas) y ventanas que se cerraban después de fallas del servidor, por ejemplo. Esa respuesta resuelve mis dos problemas con --tab + $ SHELL. Nice
grabantot
1

comentando la respuesta de Lekensteyn. Sé que esta es una publicación antigua, pero para cualquiera que lo encuentre útil (como acabo de hacer), en lugar de crear otro "script hacky" con solo poner una función dentro del script que está llamando

hacky_function()
{
"$@"
exec "$SHELL"
}

Llame a su script con "x-terminal-emulator -e / path / to / script hacky_function argumentos opcionales aquí"

No olvides poner "$ @" al final del guión

Sruli
fuente
-2

Use el comando de pantalla y -d desconectar de una sesión de pantalla existente, y vuelva a adjuntar aquí -m forzar una nueva sesión de pantalla -S crear una sesión con nombre en lugar de usar el nombre predeterminado

Jack Heath
fuente
esta respuesta no es clara en absoluto, tenga cuidado de hacerla más comprensible
azerafati
@azerafati de hecho, la pantalla no abre ninguna ventana de terminal ... ni siquiera está destinada a ese paquete increíble ...
erm3nda