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

0

Eu estou tentando abrir um emulador de terminal enquanto simultaneamente passa 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 ele fecha)?

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

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

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.

    
por imallett 21.05.2015 / 07:48

2 respostas

0

Além de cmd , todos são emuladores de terminal X e a maioria fornece alguma variação da opção -e do xterm. Onde eles diferem é se eles exigem que o valor da opção seja citado.

Além das limitações do shell, o xterm usa all dos tokens anteriores -e como parte do comando. Eles não precisam ser citados como mostrado (o que faz um token). O rxvt segue esse comportamento (veja documentação ).

Existem também diferenças sutis, de acordo com a forma como o comando é passado para o shell; O xterm documenta parte disso no manual (procure por "shell" e "filter"), enquanto nenhum os outros fornecem esse nível de detalhe. Você só pode encontrar aqueles lendo o código-fonte ou testando.

De acordo com a documentação , o konsole também segue o -e comportamento do xterm (a convenção predominante).

O gnome-terminal difere da convenção (consulte documentação ):

--commandCMD, -eCMD

Runs the CMD command at startup time.

--executeCMD ARGS, -xCMD ARGS

Executes the command CMD with its arguments ARGS on startup. No arguments beyond this one will be processed by the terminal. This behaviour mimics the xterm -e behaviour.

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

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

lxterminal

-eSTRING--command=STRING--commandSTRING

This option specifies the program (and its command line arguments) to be run in the terminal. Except in the --command= form, this must be the last option on the command line.

terminator documentação corresponde ao gnome-terminal

A documentação do xfce4-terminal é compatível com o lxterminal.

    
por 21.05.2015 / 10:40
0

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

rxvt -e "ls; sleep 3"

falha, mesmo que seja da mesma forma que xterm foi invocado.

Se você tentar fechar a cota, isso 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 eu encontrei aqui , você pode chamar o emulador de terminal para executar bash e, em seguida, passar comandos para o interpretador bash em vez do do emulador. Isso resolve o problema e tem um comportamento mais consistente, já que em todos os casos é bash que está analisando a string de comando principal.

Usando um truque que encontrei aqui , você pode invocar bash para xterm , deixando uma concha aberta e, assim, produzir a variante persistente:

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

Isso funciona para konsole , lxterminal e terminator também ( terminator também suporta -x ). No entanto, se você pensar nisso (ou usar gnome-terminal do equivalente em -x e observar o aviso ao tentar fechar a janela), perceberá que o terminal está executando bash e que bash está executando bash . Em vez disso, você quer substituir o bash -que vai terminar com bash -that-will:

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

Isso pode ser visto no site aqui .

Nota uma alternativa é a opção xterm -hold , que tem equivalentes em alguns outros terminais (por exemplo, konsole --hold ). A opção hold impede que o emulador de terminal feche, mas não retorna a interatividade. Isso não era exatamente o que eu estava procurando, mas eu listei abaixo para completar.

Aqui está a tabela (formato diferente, uma vez que 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 pontos de interrogação restantes não são possíveis.

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

    
por 21.05.2015 / 21:53

Tags