Abra el terminal gnome mediante programación y ejecute comandos después de ejecutar bashrc

35

Para comenzar mi entorno de desarrollo escribí un pequeño script. Una parte es abrir un terminal gnome con varias pestañas donde automáticamente se deben ejecutar algunos comandos. Algunos de esos comandos dependen de un .bashrc ya ejecutado. Pero cuando se usa

gnome-terminal --tab -e "comando" --tab --tab

el comando se ejecuta antes de que se ejecute .bashrc. ¿Existe la posibilidad de que un gnome-terminal automatizado se comporte como uno usado manualmente? (incluso los comandos como "cd / foo / bar" no funcionan con gnome-terminal -e)

Zardoz
fuente

Respuestas:

45

Una vez que gnome-terminal ha comenzado bash, está fuera del ciclo en lo que respecta a la ejecución del comando: solo administra la entrada y la salida. Por lo tanto, necesitará la cooperación de bash para ejecutar algo después de que ~/.bashrcse haya cargado.

Primero, en muchos casos, no es necesario ejecutar comandos después ~/.bashrc. Por ejemplo, simplemente se puede abrir una terminal en un directorio particular cd /foo/bar && gnome-terminal. Puede establecer las variables de entorno de una manera similar: VAR=value gnome-terminal. (Si ~/.bashrcanula las variables de entorno, lo está haciendo mal: las definiciones de variables de entorno pertenecen~/.profile )

Para ejecutar comandos en la terminal, pero antes ~/.bashrc, puedes hacer

gnome-terminal -x sh -c 'command1; command2; exec bash'

Si desea usar varias pestañas, debe usarlas en -elugar de -x. Gnome-terminal divide inútilmente el argumento de -een espacios en lugar de ejecutarlo a través de un shell. No obstante, puede escribir un comando de shell si se asegura de no incluir espacios en él. Sin embargo, al menos con gnome-terminal 2.26, puede usar pestañas (reemplazar <TAB>por un carácter de pestaña literal):

gnome-terminal -e 'sh -c command1;command2;exec<TAB>bash'
gnome-terminal --tab -e 'sh -c command1;<TAB>exec<TAB>bash' \
               --tab -e 'sh -c command2;<TAB>exec<TAB>bash'

Si necesita ejecutar comandos después ~/.bashrc, haga que ejecute los comandos. Por ejemplo, incluya el siguiente código al final de ~/.bashrc:

eval "$BASH_POST_RC"

Luego, para ejecutar un código después (realmente, al final de) su bashrc:

gnome-terminal -x sh -c BASH_POST_RC=\''command1; command2'\''; exec bash'

o (menos pesado en la cita)

BASH_POST_RC='command1; command2' gnome-terminal

Aunque no recomiendo hacerlo de esta manera, es posible que le interesen las técnicas mencionadas en Cómo iniciar un terminal con cierto texto ya ingresado en la línea de comandos. .

Gilles 'SO- deja de ser malvado'
fuente
Sí, de hecho un buen truco. Nunca pensé en eso. Ahora debo encontrar una manera de establecer la variable BASH_POST_RC de manera diferente para la pestaña específica. Y eso todavía parece ser un problema. Un simple "gnome-terminal --tab -e 'BASH_POST_RC = ls' --tab" no es posible :-(
Zardoz
@Zardoz: En realidad, puedes engañar a gnome-terminal usando caracteres de tabulación (mira mi respuesta revisada). Cuidado con los múltiples niveles de citas.
Gilles 'SO- deja de ser malvado'
.. funciona :-) ... muchas gracias por su solución y su paciencia. Aquí mi comando completo (funciona incluso con esos espacios en los comandos: gnome-terminal --working-directory = "/ home / zardoz / projects / my_rails_app" --tab -e 'bash -c "export BASH_POST_RC = \" rails server \ "; exec bash" '--tab -e' bash -c "export BASH_POST_RC = \" autotest \ "; exec bash" '--tab
Zardoz
Finalmente lo hice funcionar ... Después de tantas pruebas con citas completas. Aquí está el mío, usando zsh y abriendo un servidor y una consola a la vez:gnome-terminal --geometry=198x44 --working-directory=/home/username/Workspace/project_name --tab --title server -e 'zsh -c "export BASH_POST_RC=\"rails server\"; exec zsh"' --tab --title console -e 'zsh -c "export BASH_POST_RC=\"rails console\"; exec zsh"'
Augustin Riedinger el
1
@terdon No, gnome-terminal -eno invoca un shell en absoluto. Si ejecuta gnome-terminal -e 'sleep 9', eso ejecuta el comando sleepcon el argumento 9, y no está involucrado ningún shell. Si ejecuta gnome-terminal -e 'sleep 9;bash', el terminal se abre y cierra inmediatamente, porque se sleepqueja de que 9;bashno es un intervalo de tiempo válido. Puedes observar lo que está sucediendostrace -f -eexecve gnome-terminal -e …
Gilles 'SO- deja de ser malvado'
6

Cuando usa la -eopción gnome-terminal, ejecutará ese comando sin iniciar un nuevo shell (incluso puede ejecutar algo como:) gnome-terminal -e gedit, por lo que si desea ejecutar un comando en el bashshell en una nueva terminal / pestaña, debe hacer algo como esto:

gnome-terminal -x bash -c "command"

Pero tenga en cuenta que cuando "command"finalice el terminal / pestaña también finalizará.

Ciro
fuente
1
Creo que quieres decir gnome-terminal -x bash -c "command"( -eespera un solo argumento). Y es bastante simple ejecutar un shell después command, al menos mientras comience una sola pestaña: vea mi respuesta .
Gilles 'SO- deja de ser malvado'
gnome-terminal -x "bash" -c "command"trabajó para mi. Observe las citas en el valor -x arg.
m3nda
Me sale # Option “-x” is deprecated and might be removed in a later version of gnome-terminal.`
MrCholo
1
por favor, ¿qué hacemos ya que los -xy -eoptons están en desuso?
nyxee
Creo que esto no se ejecuta ~/.bashrcantes de ejecutar el comando, como lo solicitó originalmente el OP.
IgNite