Abra um comando em uma nova instância de vários emuladores de terminal

Abra um comando em uma nova instância de vários emuladores de terminal

Estou tentando abrir um emulador de terminal enquanto passo simultaneamente um comando composto para ele. Quais são os comandos para fazer isso (duas versões: onde o terminal permanece aberto após a conclusão ou onde fecha)?


Por exemplo, para o xtermemulador de terminal, o comando xterm -e "ls; sleep 3"cria uma nova xtermjanela GUI, lista o diretório atual, aguarda 3 segundos e depois fecha a janela.

Estou especificamente interessado em invocações para gnome-terminal, konsole, lxterminal, rxvt, terminator, xfce4-terminal, e xterm, bem como no Windows cmd.


Aqui estão alguns exemplos de uso do que eu descobri até agora:

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"      |

Alguém pode me ajudar a preencher mais? Respostas parciais são bem-vindas.

Responder1

Além disso cmd, todos são emuladores de terminal X e a maioria fornece alguma variação da -eopção do xterm. A diferença reside no fato de exigirem que o valor da opção seja cotado.

Além das limitações do shell, o xterm usatodosdos tokens passados -e​​como parte do comando. Eles não precisam ser citados conforme mostrado (o que constitui um token). rxvt segue esse comportamento (vejadocumentação).

Existem também diferenças sutis, de acordo com a forma como o comando é passado para o shell; xterm documenta um pouco disso nomanual(procure "shell" e "filter") enquanto nenhum dos outros fornece esse nível de detalhe. Você só pode encontraraqueleslendo o código-fonte ou testando.

De acordo comdocumentação, o konsole também segue o -ecomportamento do xterm (a convenção predominante).

gnome-terminal difere da convenção (vejadocumentação):

--commandDMC, -eDMC

Executa oDMCcomando no momento da inicialização.

--executeDMC ARGS, -xDMC ARGS

Executa o comandoDMCcom seus argumentosARGSno arranque. Nenhum argumento além deste será processado pelo terminal. Este comportamento imita o comportamento xterm -e.

Ou seja, sua -eopção espera um único token. Em vez de alterá-lo para fornecer compatibilidade, seus desenvolvedores optaram por fornecersemelhantefuncionalidade com um nome de opção diferente.

Os outros usam quase todo o mesmo código do gnome-terminal, e dependendo da extensão do compartilhamento, podem implementar -ecomo os outros, ou apenas copiar do gnome-terminal:

lxterminal

-eCORDA--command=CORDA--commandCORDA

Esta opção especifica o programa (e seus argumentos de linha de comando) a ser executado no terminal. Exceto no formato --command=, esta deve ser a última opção na linha de comando.

Exterminador do Futurodocumentaçãocorresponde ao gnome-terminal

terminal xfce4documentaçãocorresponde ao lxterminal.

Responder2

Parece que o principal problema que tive foi que, para a maioria dos emuladores de terminal, espera-se que o argumento do comando seja um único item (ou seja, não há análise no estilo shell). Por exemplo

rxvt -e "ls; sleep 3"

falha, mesmo que esta seja a mesma maneira xtermque foi invocada.

Se você tentar tirar aspas, também não funcionará. Por exemplo:

rxvt -e ls; sleep 3

é analisado e executado separadamente, como dois comandos:

rxvt -e ls
sleep 3

Usando um truque que encontreiaqui, você pode invocar o emulador de terminal para executar bashe, em seguida, passar comandos para basho intérprete de em vez do emulador. Isso resolve o problema e tem um comportamento mais consistente, pois em todos os casos é bashquem está analisando a string de comando principal.

Usando um truque que encontreiaqui, você pode invocar bashfor xterm, deixando um shell aberto e produzindo assim a variante persistente:

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

Isso funciona para konsole, lxterminale terminatortambém ( terminatorpelo menos também suporta, -xao que parece). Porém, se você pensar bem (ou usar gnome-terminalo equivalente -xe depois observar o aviso ao tentar fechar a janela), perceberá que o terminal está rodando bashe que aquele bashestá rodando bash. Em vez disso, você quersubstituiro bash-que-vai-terminar com um bash-que-não-vai:

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

Isso pode ser visto na naturezaaqui.

Observaçãouma alternativais opção xtermde -hold, que tem equivalentes em alguns outros terminais (por exemplo, konsole's --hold). A opção hold evita que o emulador de terminal feche, mas não devolve a interatividade. Isso não era realmente o que eu estava procurando, mas listei abaixo para completar.

Aqui está a tabela (formato diferente, pois esses comandos estão ficando mais longos). Eu também adicionei urxvt. Todas as invocações foram testadas:

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"                 

Os restantes pontos de interrogação não creio que sejam possíveis.

Sinta-se à vontade para editar esta tabela com quaisquer novos terminais, novas invocações ou correções.

informação relacionada