![Abra um comando em uma nova instância de vários emuladores de terminal](https://rvso.com/image/1451249/Abra%20um%20comando%20em%20uma%20nova%20inst%C3%A2ncia%20de%20v%C3%A1rios%20emuladores%20de%20terminal.png)
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 xterm
emulador de terminal, o comando xterm -e "ls; sleep 3"
cria uma nova xterm
janela 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 -e
opçã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 -e
comportamento do xterm (a convenção predominante).
gnome-terminal difere da convenção (vejadocumentação):
--command
DMC, -e
DMCExecuta oDMCcomando no momento da inicialização.
--execute
DMC ARGS, -x
DMC ARGSExecuta o comandoDMCcom seus argumentosARGSno arranque. Nenhum argumento além deste será processado pelo terminal. Este comportamento imita o comportamento xterm -e.
Ou seja, sua -e
opçã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 -e
como os outros, ou apenas copiar do gnome-terminal:
-e
CORDA--command=
CORDA--command
CORDAEsta 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 xterm
que 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 bash
e, em seguida, passar comandos para bash
o intérprete de em vez do emulador. Isso resolve o problema e tem um comportamento mais consistente, pois em todos os casos é bash
quem está analisando a string de comando principal.
Usando um truque que encontreiaqui, você pode invocar bash
for xterm
, deixando um shell aberto e produzindo assim a variante persistente:
rxvt -e bash -c "ls;sleep 3;bash"
Isso funciona para konsole
, lxterminal
e terminator
também ( terminator
pelo menos também suporta, -x
ao que parece). Porém, se você pensar bem (ou usar gnome-terminal
o equivalente -x
e depois observar o aviso ao tentar fechar a janela), perceberá que o terminal está rodando bash
e que aquele bash
está 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 xterm
de -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.