Abrindo um terminal que não seja o xterm, executando um comando nele e não fechando o terminal após terminar com sucesso

5

Eu tenho o seguinte script na minha caixa Arch Linux:

#!/bin/bash
xterm -e "sudo pacman -Syu;bash"

Isto irá disparar um xterm e executar o comando sudo pacman -Syu nele. Por causa da parte ;bash , ela não fechará a janela xterm quando o comando estiver concluído. Este é um comando para atualizar meu sistema e não quero fechar porque gostaria de ver a saída.

Por que isso não funcionará com outros terminais, e em particular com o lxterminal e o roxterm (os únicos outros que eu tentei)? O mesmo comando exato com lxterminal ou roxterm em vez de xterm acionará o terminal e o fechará imediatamente após a execução do comando.

    
por geo909 17.09.2014 / 02:16

2 respostas

2

O problema essencial é que os terminais baseados em VTE não lidam com a linha de comando da mesma maneira que o xterm. Isso é ao lado dos possíveis problemas com a opção (desnecessária nesta discussão).

As aspas neste comando

xterm -e "sudo pacman -Syu;bash"

é o problema. Essa string citada é um único token, passado para o xterm como um único parâmetro.

Com o xterm, os tokens após -e são tentados como parâmetros para uma chamada execv. Caso contrário, ele tentará algo como "${SHELL:-sh}" -c "parameters" (executa seu shell preferido para interpretar parameters como uma linha de comando). O konsole faz um ou outro (provavelmente o primeiro, já que esse era o comportamento original do xterm, e a maioria dos designs do konsole data do final dos anos 90). Quando o xterm foi modificado para o luit, a alternativa "falhando" ajudou a passar os parâmetros para o luit.

Os terminais baseados em VTE por um tempo tentaram fazer um aspecto em uma opção de linha de comando e o outro em outra opção (se bem me lembro, -e e -x , mas trocando os papéis das duas opções e o assunto de um relatório de bug interessante do Debian que eu não vejo no momento). Na versão atual, tentando

gnome-terminal -e "sudo pacman -Syu;bash"

falha porque só funciona com o comportamento original do tipo xterm. E (tendo em mente que os outros terminais usam versões mais antigas do VTE), uma vez que os desenvolvedores do gnome-terminal (que se sobrepõem aos desenvolvedores VTE ...) perderam a opção -x um tempo atrás, essa opção não está disponível o comando. Este funciona porque segue o modelo xterm original:

gnome-terminal -e "bash -c \"sudo pacman -Syu;bash\""

A opção -e é parcialmente endereçada no Debian por um script de shell, que tenta fornecer um conjunto mínimo de opções (incluindo uma para título). A política Debian para isso foi baseada no xterm no final dos anos 90, e tem sido um tópico de discussão mais de uma vez.

Leitura adicional:

por 19.01.2017 / 00:58
7

Diferentes emuladores têm recursos e protocolos diferentes para o recurso de espera aberta. Alguns simplesmente não vão / não podem fazer isso. Outros exigem que o script especifique que o emulador permaneça aberto. Eu corri para isso ao escrever um script simples para um programa chamado HDSentinel. Aqui estão as várias soluções possíveis:

KDE (emulador do Konsole)

konsole -hold -e sudo ./HDSentinel

( -hold é o parâmetro necessário)

Esclarecimento (emulador de terminologia)

terminology --hold -e "sudo ./HDSentinel"

( --hold é o parâmetro necessário)

XFCE (emulador XFCE4)

xfce4-terminal -H -x "sudo ./HDSentinel"

( -H é o parâmetro necessário;)

EDIT: -x é usado em vez de -e no terminal xfce

Mate (emulador mate-terminal)

mate-terminal --window-with-profile=HoldOpen -e "sudo ./HDSentinel"

(com este emulador você deve primeiro criar um perfil personalizado para manter o emulador aberto, eu chamei o meu HoldOpen, mas qualquer nome servirá)

Gnome (emulador de terminal gnome)

gnome-terminal --window-with-profile=HoldOpen -e "sudo ./HDSentinel"

(funciona da mesma forma que o Mate, cria um perfil para manter o emulador aberto)

LXDE (lxterminal)

O emulador lxterminal que vem com o LXDE não suporta manter o terminal aberto

Assim, a linha de fundo é que alguns emuladores suportarão a espera, e outros não. Daqueles que fazem, como você ativa esse recurso irá variar. Se você está olhando para um emulador não listado aqui, você terá que procurar no google o emulador para descobrir se / como você habilita manter aberto.

Se o emulador que você tem não suporta manter aberto, você pode achar que sua distro inclui um emulador alternativo que o suporta (muitas distros incluem o xterm, bem como seu emulador de versão para desktop). Se você não tiver um emulador que suporte hold open, você sempre pode obter um do repositório de software.

Esta informação representa um pouco de tempo de pesquisa, então espero que isso ajude as pessoas a economizar tempo e frustração. BTW, xterm também usa o parâmetro -hold , então acredito que ;bash servirá para manter aberto um emulador que ofereça um parâmetro para o recurso hold hold. Mas que ele não irá criar um recurso hold hold se o emulador não suportar isso (como no caso do lxterminal) ou habilitar hold open se esse emulador utilizar um perfil customizado para habilitar hold open (como no caso do Gnome). / p>     

por 18.09.2014 / 22:17