Abrir un comando en una nueva instancia de varios emuladores de terminal

Abrir un comando en una nueva instancia de varios emuladores de terminal

Estoy intentando abrir un emulador de terminal y al mismo tiempo le paso un comando compuesto. ¿Cuáles son los comandos para hacer esto (dos versiones: donde la terminal permanece abierta después de completar o donde se cierra)?


Por ejemplo, para el xtermemulador de terminal, el comando xterm -e "ls; sleep 3"crea una nueva xtermventana GUI, enumera el directorio actual, espera 3 segundos y luego cierra la ventana.

Estoy específicamente interesado en invocaciones para gnome-terminal, konsole, lxterminal, rxvt, terminator, xfce4-terminaly xterm, así como en Windows cmd.


Aquí hay algunos ejemplos de usos de lo que he descubierto hasta ahora:

Emulator        |  Invocation (Exiting)              |  Invocation (Persistent)           |
----------------+------------------------------------+------------------------------------+
cmd             |  start CMD /C "DATE /T & TIME /T"  |  start CMD /K "DATE /T & TIME /T"  |
gnome-terminal  |  ???                               |  ???                               |
konsole         |  ???                               |  ???                               |
lxterminal      |  ???                               |  ???                               |
rxvt            |  ???                               |  ???                               |
terminator      |  ???                               |  ???                               |
xfce4-terminal  |  ???                               |  ???                               |
xterm           |  xterm -e "ls; sleep 3"            |  xterm -e "ls; sleep 3; bash"      |

¿Alguien puede ayudarme a completar más? Se aceptan respuestas parciales.

Respuesta1

Aparte de cmd, todos estos son emuladores de terminal X y la mayoría ofrece alguna variación de la -eopción de xterm. Donde difieren es en si requieren que se cotice el valor de la opción.

Aparte de las limitaciones del shell, xterm usatodode los tokens pasados -e​​como parte del comando. No es necesario citarlos como se muestra (lo que constituye un token). rxvt sigue ese comportamiento (verdocumentación).

También existen diferencias sutiles, según cómo se pasa el comando al shell; xterm documenta algo de eso en elmanual(busque "shell" y "filter") mientras que ninguno de los demás proporciona ese nivel de detalle. solo puedes encontraraquellosleyendo el código fuente o probando.

De acuerdo adocumentación, konsole también sigue el -ecomportamiento de xterm (la convención predominante).

gnome-terminal difiere de la convención (verdocumentación):

--commandCMD, -eCMD

ejecuta elCMDcomando en el momento del inicio.

--executeCMD ARGS, -xCMD ARGS

Ejecuta el comandoCMDcon sus argumentosARGSen el arranque. El terminal no procesará ningún argumento más allá de este. Este comportamiento imita el comportamiento xterm -e.

Es decir, su -eopción espera un único token. En lugar de modificarlo para ofrecer compatibilidad, sus desarrolladores optaron por proporcionarsimilarfuncionalidad con un nombre de opción diferente.

Los demás usan casi todo el mismo código que gnome-terminal y, dependiendo del grado de uso compartido, pueden implementarlo -ecomo los demás o simplemente copiarlo desde gnome-terminal:

terminal lx

-eCADENA--command=CADENA--commandCADENA

Esta opción especifica el programa (y sus argumentos de línea de comando) que se ejecutará en la terminal. Excepto en el formulario --command=, esta debe ser la última opción en la línea de comando.

terminadordocumentacióncoincide con gnome-terminal

terminal xfce4documentacióncoincide con lxterminal.

Respuesta2

Parece que el principal problema que tuve fue que para la mayoría de los emuladores de terminal, se espera que el argumento del comando sea un solo elemento (es decir, no hay análisis de estilo shell). Por ejemplo

rxvt -e "ls; sleep 3"

falla, aunque esta es la misma forma en que xtermse invocó.

Si intenta quitar las comillas, tampoco funcionará. Por ejemplo:

rxvt -e ls; sleep 3

se analiza y ejecuta por separado, como dos comandos:

rxvt -e ls
sleep 3

Usando un truco que encontréaquí, puede invocar el emulador de terminal para ejecutar bashy luego pasar comandos al bashintérprete de en lugar del del emulador. Esto resuelve el problema y tiene un comportamiento más consistente, ya que en todos los casos es bashel que analiza la cadena de comando principal.

Usando un truco que encontréaquí, puedes invocar bashfor xterm, dejando así un shell abierto y produciendo así la variante persistente:

rxvt -e bash -c "ls;sleep 3;bash"

Esto funciona para konsole, lxterminaly terminatortambién ( terminatoral menos también -xparece compatible). Sin embargo, si lo piensas (o usas gnome-terminalel equivalente -xy luego observas la advertencia cuando intentas cerrar la ventana), te das cuenta de que la terminal se está ejecutando bashy que eso bashse está ejecutando bash. En cambio, quieresreemplazarel bash-eso-va-a-terminar con un bash-eso-no:

rxvt -e bash -c "ls;sleep 3;exec bash"

Esto se puede ver en la naturaleza.aquí.

Notauna alternativaes la opción xtermde -hold, que tiene equivalentes en algunos otros terminales (por ejemplo, konsole's --hold). La opción de retención evita que el emulador de terminal se cierre, pero no le devuelve la interactividad. Esto no era realmente lo que estaba buscando, pero lo he enumerado a continuación para que esté completo.

Aquí está la tabla (formato diferente ya que estos comandos son cada vez más largos). También he añadido urxvt. Todas las invocaciones han sido probadas:

Emulator       | Command Type        | Invocation                                      
---------------+---------------------+-------------------------------------------------
cmd            | exiting             | start CMD /C "DATE /T & TIME /T"                
               | persistent          | ???                                             
               | persistent (inter.) | start CMD /K "DATE /T & TIME /T"                
---------------+---------------------+-------------------------------------------------
gnome-terminal | exiting             | gnome-terminal -x bash -c "ls;sleep 3"          
               | persistent          | ???                                             
               | persistent (inter.) | gnome-terminal -x bash -c "ls;sleep 3;exec bash"
---------------+---------------------+-------------------------------------------------
konsole        | exiting             | konsole -e bash -c "ls;sleep 3"                 
               | persistent          | konsole --hold -e bash -c "ls;sleep 3"          
               | persistent (inter.) | konsole -e bash -c "ls;sleep 3;exec bash"       
---------------+---------------------+-------------------------------------------------
lxterminal     | exiting             | lxterminal -e bash -c "ls;sleep 3"              
               | persistent          | ???                                             
               | persistent (inter.) | lxterminal -e bash -c "ls;sleep 3;exec bash"    
---------------+---------------------+-------------------------------------------------
rxvt           | exiting             | rxvt -e bash -c "ls;sleep 3"                    
               | persistent          | ???                                             
               | persistent (inter.) | rxvt -e bash -c "ls;sleep 3;exec bash"          
---------------+---------------------+-------------------------------------------------
terminator     | exiting             | terminator -x bash -c "ls;sleep 3"              
               | persistent          | ???                                             
               | persistent (inter.) | terminator -x bash -c "ls;sleep 3;exec bash"    
---------------+---------------------+-------------------------------------------------
urxvt          | exiting             | urxvt -e bash -c "ls;sleep 3"                   
               | persistent          | urxvt -hold -e bash -c "ls;sleep 3"             
               | persistent (inter.) | urxvt -e bash -c "ls;sleep 3;exec bash"         
---------------+---------------------+-------------------------------------------------
xfce4-terminal | exiting             | xfce4-terminal -x bash -c "ls;sleep 3"          
               | persistent          | xfce4-terminal --hold -x bash -c "ls;sleep 3"   
               | persistent (inter.) | xfce4-terminal -x bash -c "ls;sleep 3;exec bash"
---------------+---------------------+-------------------------------------------------
xterm          | exiting             | xterm -e "ls;sleep 3"                           
               | persistent          | xterm -hold -e "ls; sleep 3"                    
               | persistent (inter.) | xterm -e "ls;sleep 3;exec bash"                 

Los restantes signos de interrogación no creo que sean posibles.

Siéntase libre de editar esta tabla con nuevos terminales, nuevas invocaciones o correcciones.

información relacionada