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 xterm
emulador de terminal, el comando xterm -e "ls; sleep 3"
crea una nueva xterm
ventana 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-terminal
y 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 -e
opció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 -e
comportamiento de xterm (la convención predominante).
gnome-terminal difiere de la convención (verdocumentación):
--command
CMD, -e
CMDejecuta elCMDcomando en el momento del inicio.
--execute
CMD ARGS, -x
CMD ARGSEjecuta 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 -e
opció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 -e
como los demás o simplemente copiarlo desde gnome-terminal:
-e
CADENA--command=
CADENA--command
CADENAEsta 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 xterm
se 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 bash
y luego pasar comandos al bash
inté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 bash
el que analiza la cadena de comando principal.
Usando un truco que encontréaquí, puedes invocar bash
for xterm
, dejando así un shell abierto y produciendo así la variante persistente:
rxvt -e bash -c "ls;sleep 3;bash"
Esto funciona para konsole
, lxterminal
y terminator
también ( terminator
al menos también -x
parece compatible). Sin embargo, si lo piensas (o usas gnome-terminal
el equivalente -x
y luego observas la advertencia cuando intentas cerrar la ventana), te das cuenta de que la terminal se está ejecutando bash
y que eso bash
se 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 xterm
de -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.