¿Cómo ejecutar xfce-terminal con diferentes comandos por pestaña y seguir usando las pestañas después de que los comandos hayan regresado?

20

Para mantener la descripción general, me gusta colocar varios comandos siempre en el mismo orden e iniciarlos automáticamente juntos (gradle, git, base de datos, scala-REPL, jboss ...)

-H (mantener) parece significar que el terminal no se cierra después de la finalización, pero ¿cómo termino tal proceso intencionalmente? ¿De ningún modo? De tal manera que pueda seguir usando el terminal.

Estoy usando xubuntu con xfce4-terminal y bash. ¿Existe una mejor solución GUI para iniciar múltiples comandos, con la capacidad de continuar trabajando en esa ventana / pestaña?

Actualización: si no conoce estos comandos: Jboss y gradle producen continuamente resultados, que no desea que se mezclen en el mismo terminal. Y a veces deben interrumpirse con ^ C y reiniciarse. No me gusta volver a abrir un término xfce4 y navegar al directorio en el que necesito actuar.

La base de datos y scala-REPL son interactivos, por lo que no tiene sentido iniciarlos en segundo plano.

Mi script de inicio actual simplemente navega a los directorios deseados y abre todas las pestañas en el orden correcto para encontrarlas siempre en la misma posición, nombrando cada pestaña para su propósito:

xfce4-terminal -T eclipse   --working-directory=/home/stefan/oximity -e "/opt/eclipse/eclipse" \
    --tab -T arandr --working-directory=/home/stefan/oximity -e "arandr /home/stefan/.screenlayout/oximity.sh" \
    --tab -T bash       --working-directory=/home/stefan/oximity \
    --tab -T gradle     --working-directory=/home/stefan/oximity/med \
    --tab -T git        --working-directory=/home/stefan/oximity/med \
    --tab -T mysql      --working-directory=/opt/mini/mysql \
    --tab -T jboss      --working-directory=/opt/mini/jboss \
    --tab -T jboss-log  --working-directory=/opt/mini/jboss/standalone/log \
    --tab -T scala-REPL --working-directory=/home/stefan/proj/mini/forum -e /opt/scala/bin/scala

Eclipse y arandr se separan del shell y se ejecutan en su propia ventana, por lo que funciona el parámetro -e (ejecutar). Creo que para scala-REPL funciona, ya que es el último comando de la lista.

usuario desconocido
fuente
Tu pregunta aún no está clara para mí. ¿Desea que un terminal vuelva a shell una vez que finalice el comando con el que se inició? Algo como xterm -e 'stuff;bash'?
frostschutz
1
¡Esta pregunta aún necesita trabajo! Encontré este hilo, creo que esto es lo que está buscando el OP: ¿Cómo mantener abierto el terminal xfce4? . Quiere saber cómo acceder a una pestaña donde se ha usado el interruptor "-H" y continuar usándolo como una ventana de terminal normal. OP, ¿puedes confirmar si estoy en lo correcto?
slm
@slm: Sí, me gusta mantener el terminal abierto para procesar más comandos. Simplemente me gusta iniciar el primero de mis comandos automáticamente y tener varias pestañas con nombre.
usuario desconocido

Respuestas:

21

La -H/-holdopción es mantener abierta la ventana del emulador de terminal una vez que las aplicaciones iniciadas en ella (shell u otro) hayan salido. En ese estado, nada más puede suceder.

Si desea iniciar un comando como un trabajo de un shell interactivo en el emulador de terminal xfce4-terminal y mantener el shell en ejecución y usarlo de manera interactiva después de que la aplicación haya salido, bashpuede usar la $PROMPT_COMMANDvariable de entorno para xfce-terminaliniciar un shell interactivo que inicia el comando dado justo antes del primer aviso.

xfce4-terminal \
  -T eclipse \
  --working-directory=/home/stefan/oximity \
  -e 'env PROMPT_COMMAND="unset PROMPT_COMMAND; /opt/eclipse/eclipse" bash' \
  \
  --tab -T arandr \
  --working-directory=/home/stefan/oximity \
  -e 'env PROMPT_COMMAND="unset PROMPT_COMMAND; arandr /home/stefan/.screenlayout/oximity.sh" bash' \
  \
  --tab -T bash \
  --working-directory=/home/stefan/oximity \
  ...

De esa manera, los comandos son trabajos de ese shell, lo que significa que puede suspenderlos Ctrl-Zy reanudarlos más tarde fg/bgcomo si los hubiera ingresado en el indicador de ese shell interactivo.

Eso supone, sin embargo, que no establece el $PROMPT_COMMANDen su ~/.bashrc. También tenga en cuenta que el estado de salida del comando no estará disponible en $?.

Para hacerlo aún más parecido al comando ingresado en el indicador de comandos de la shell, incluso puede agregarlo a la lista del historial. Me gusta:

xfce4-terminal -T /etc/motd -e 'env PROMPT_COMMAND="
  unset PROMPT_COMMAND
  history -s vi\ /etc/motd
  vi /etc/motd" bash'

De esa manera, una vez que salga vi, puede presionar la Uptecla para recuperar el mismo vicomando.

Una forma más fácil de escribirlo:

PROMPT_COMMAND='unset PROMPT_COMMAND; history -s "$CMD"; eval "$CMD"' \
  xfce4-terminal --disable-server \
          -T /etc/motd -e 'env CMD="vi /etc/motd" bash' \
    --tab -T       top -e 'env CMD=top bash'

Los:

xfce4-terminal -e 'sh -c "cmd; exec bash"'

La solución como se da en otras respuestas funciona pero tiene algunos inconvenientes:

  1. Si presiona Ctrl-Cmientras se cmdestá ejecutando, eso mata el exterior shya que solo hay un grupo de proceso para ambos shy cmd.
  2. No puedes usar Ctrl-Zpara suspendercmd
  3. Al igual que en el $PROMPT_COMMANDenfoque, el estado de salida del comando no estará disponible en $?.

Puede trabajar alrededor de 1 arriba haciendo:

xfce4-terminal -e 'sh -c "trap : INT; cmd; exec bash"'

O:

xfce4-terminal -e 'sh -ic "cmd; exec bash"'

Con este último, también podrá suspender el proceso Ctrl-Z, pero no podrá usarlo fg/bg. Podrás seguir en el fondo, aunque haciendo una kill -s CONTen el pid del cmd.

Stéphane Chazelas
fuente
Guau. Eso es bastante complicado, pero parece funcionar. :) No sé por qué desapareció la recompensa. Desafortunadamente, no tuve tiempo antes de probar las pistas.
usuario desconocido
Realmente no entiendo todas las reglas del sistema de recompensas. Como creo que mereces la recompensa, reinicio una nueva recompensa.
usuario desconocido
Sí, las recompensas caducan después de 7 días, y tienes 24 horas para otorgarlas. Si no los conoce, se asignan a cualquier usuario que tenga la mayor repetición (2 o superior). Aquí hay más de lo que siempre quiso saber sobre las recompensas 8-): meta.stackexchange.com/questions/16065/…
slm
1
@AdrianLopez, en los bashscripts, no hay historial en absoluto, ya que no hay edición de línea o interacción del usuario a menos que lo use read -een su script (y verá que history -s textfunciona allí para preparar el historial visto por eso read -e). Aquí, no estamos ejecutando history -sdesde un script, sino desde el $PROMPT_COMMANDgancho de un shell interactivo.
Stéphane Chazelas
1
@ StéphaneChazelas Increíble. Siguiendo su otra valiosa respuesta aquí , debo agregar que, xfce4-terminalcomo mínimo, la versión 0.6.3 ahora quiere un parámetro adicional --disable-server- para pasar por el entorno. Ref: lists.debian.org/debian-user/2017/10/msg00045.html .
ジ ョ ー ジ
5

Hasta donde he entendido su pregunta, desea ejecutar algunos procesos en un terminal, pudiendo hacer Ctrl+ Cellos y, después de eso, mantener la ventana abierta, con el shell.

Si tengo razón, esto podría lograrse con un comando como este:

xfce4-terminal -e "bash -c 'COMMAND; exec bash'"
Rafael Cavalcanti
fuente
¿Funciona con múltiples pestañas?
usuario desconocido
@userunknown Claro. Simplemente agregue --tab antes de los otros comandos. Por ejemplo, si desea ejecutar "ls / etc" y "ls / dev", emitiría: xfce4-terminal -e "bash -c 'ls / etc; exec bash'" --tab -e "bash - c 'ls / dev; exec bash' "Si usa Gnome Terminal, debe escribir --tab también antes del primer comando.
Rafael Cavalcanti
Esto es un poco útil, aunque no tan lejos como esperaba. Cuando empiezo gradle con `xfce4-terminal --working-directory = / home / stefan / oximity / med -e" bash -c 'gradle explodedWar explodedWarSync; bash' "` se abre una pestaña, con nombre pero muestra "gradle: comando no encontrado "al ingresar el comando allí funciona bien. Git, mysql y scala funcionan bien de esa manera, pero para jboss, Ctrl-C termina toda la pestaña jboss. Solo pude preparar el shell comenzando allí, tal vez haciendo eco del comando para ingresar. Realmente no entiendo qué está haciendo las diferencias aquí.
usuario desconocido
1

múltiples aplicaciones en xfce4-terminalpestañas

Agregar un shell interactivo a cada pestaña xfce

Puedes usar este truco para agregar un shell si / cuando tienes Ctrl+Cuna pestaña:

$ xfce4-terminal -H \
     --tab -T bash -e "bash -c 'top;bash'" \
     --tab -T git  -e "bash -c 'top;bash'"

Esto te dará lo siguiente:

   ss de xfce con pestañas

   ss de xfce con Ctrl + C superior

slm
fuente
0

Al salir del shell sin -Hel terminal también se cerrará. Con este indicador, el terminal seguirá ejecutándose, pero el proceso de shell se cierra y no se puede revivir.

¿Creo que está intentando archivar que acaba de iniciar su terminal y se inicia su entorno de desarrollo?

Puede crear un script de shell y poner todos sus comandos dentro de él. Al final del script, solo comienza su shell:

#!/bin/sh

gradle &
git &
... &
.... &
jboss &

$SHELL

# some cleanup commands if needed

Entonces llame a este script vía xfce4-terminal -e /the/script. Cuando finalice $SHELLel proceso principal (su secuencia de comandos) finalice y las tareas en segundo plano recibirán la señal de salida y también se cerrarán.

Si desea mantenerlos vivos, use, por ejemplo, nohup jboss &en su secuencia de comandos

krissi
fuente
Eso no funciona porque gradle y jboss están produciendo resultados de forma permanente. No le gusta que mezclen su producción. La base de datos y el terminal scala son interactivos. No tiene sentido ponerlos en un segundo plano. La idea de abrir otros comandos en diferentes pestañas es que el historial solo se llena con pocos comandos diferentes para un tema y, por lo tanto, se puede navegar rápidamente.
usuario desconocido