Abra o terminal gnome programaticamente e execute comandos após a execução do bashrc


35

Para iniciar meu ambiente de desenvolvimento, escrevi um pequeno script. Uma parte é abrir um terminal gnome com várias guias, onde automaticamente alguns comandos devem ser executados. Alguns desses comandos dependem de um .bashrc já executado. Mas ao usar

gnome-terminal --tab -e "command" --tab --tab

o comando é executado antes da execução do .bashrc. Existe a possibilidade de fazer um gnome-terminal -e automático se comportar como um usado manualmente? (mesmo comandos como "cd / foo / bar" não funcionam com o gnome-terminal -e)

Respostas:


45

Depois que o gnome-terminal inicia o bash, ele fica fora de loop no que diz respeito à execução de comandos: ele gerencia apenas a entrada e a saída. Portanto, você precisará da cooperação do bash para executar algo após o ~/.bashrccarregamento.

Primeiro, em muitos casos, você não precisa executar comandos depois ~/.bashrc. Por exemplo, a abertura de um terminal em um diretório específico pode ser feita simplesmente com cd /foo/bar && gnome-terminal. Você pode definir variáveis de ambiente de forma semelhante: VAR=value gnome-terminal. (Se você ~/.bashrcsubstituir as variáveis ​​de ambiente, estará fazendo errado: as definições das variáveis ​​de ambiente pertencem~/.profile )

Para executar comandos no terminal, mas antes ~/.bashrc, você pode fazer

gnome-terminal -x sh -c 'command1; command2; exec bash'

Se você quiser usar várias guias, precisará usar em -evez de -x. O Gnome-terminal, sem ajuda, divide o argumento de -eem espaços, em vez de executá-lo através de um shell. No entanto, você pode escrever um comando do shell se não incluir espaços nele. Pelo menos com o gnome-terminal 2.26, você pode usar tabulações (substitua <TAB>por um caractere de tabulação literal):

gnome-terminal -e 'sh -c command1;command2;exec<TAB>bash'
gnome-terminal --tab -e 'sh -c command1;<TAB>exec<TAB>bash' \
               --tab -e 'sh -c command2;<TAB>exec<TAB>bash'

Se você precisar executar comandos depois ~/.bashrc, faça -o executar os comandos. Por exemplo, inclua o seguinte código no final de ~/.bashrc:

eval "$BASH_POST_RC"

Depois, execute um código após (realmente, no final do) seu bashrc:

gnome-terminal -x sh -c BASH_POST_RC=\''command1; command2'\''; exec bash'

ou (menos pesado na citação)

BASH_POST_RC='command1; command2' gnome-terminal

Embora eu particularmente não recomendo fazê-lo dessa maneira, você pode estar interessado nas técnicas mencionadas em Como iniciar um terminal com determinado texto já inserido na linha de comando? .


Sim, de fato, um bom truque. Nunca pensei nisso. Agora, preciso encontrar uma maneira de definir a variável BASH_POST_RC de maneira diferente para a guia específica. E isso ainda parece ser um problema. Um simples "gnome-terminal --tab -e 'BASH_POST_RC = ls' --tab" não é possível :-(
Zardoz

@Zardoz: Na verdade, você pode enganar o gnome-terminal usando caracteres de tabulação (veja minha resposta revisada). Observe os vários níveis de citação.
Gilles 'SO- stop be evil'

.. funciona :-) ... muito obrigado pela sua solução e sua paciência. Aqui meu comando completo (funciona mesmo com esses espaços nos comandos: gnome-terminal --working-directory = "/ home / zardoz / projects / my_rails_app" --tab -e 'bash -c "exporta BASH_POST_RC = \" servidor rails \ "; exec bash" '--tab -e' bash -c "export BASH_POST_RC = \" autoteste \ "; exec bash" '--tab
Zardoz

Finalmente funcionou ... Depois de tantos testes com aspas o tempo todo. Aqui é meu, usando zsh e abrindo um servidor e um console ao mesmo tempo:gnome-terminal --geometry=198x44 --working-directory=/home/username/Workspace/project_name --tab --title server -e 'zsh -c "export BASH_POST_RC=\"rails server\"; exec zsh"' --tab --title console -e 'zsh -c "export BASH_POST_RC=\"rails console\"; exec zsh"'
Augustin Riedinger

11
@terdon Não, gnome-terminal -enão invoca um shell. Se você executar gnome-terminal -e 'sleep 9', isso executa o comando sleepcom o argumento 9, e nenhum shell está envolvido. Se você executar gnome-terminal -e 'sleep 9;bash', o terminal abrirá e fechará imediatamente, porque sleepreclama que 9;bashnão é um intervalo de tempo válido. Você pode observar o que está acontecendostrace -f -eexecve gnome-terminal -e …
Gilles 'SO- stop be evil'

6

Quando você usa a -eopção, gnome-terminalele executará esse comando sem iniciar um novo shell (você pode até executar algo como gnome-terminal -e gedit:); portanto, se você quiser executar um comando no bashshell em um novo terminal / guia, precisará fazer algo assim:

gnome-terminal -x bash -c "command"

Mas observe que quando "command"terminar, o terminal / guia também terminará.


11
Eu acho que você quer dizer gnome-terminal -x bash -c "command"( -eespera um único argumento). E é bastante simples executar um shell depois command, pelo menos desde que você esteja iniciando uma única guia - veja minha resposta .
Gilles 'SO- stop be evil'

gnome-terminal -x "bash" -c "command"trabalhou para mim. Observe aspas no valor -x arg.
M3nda 29/07

Eu recebo # Option “-x” is deprecated and might be removed in a later version of gnome-terminal.`
MrCholo 15/12/19

11
por favor, o que fazemos desde que os optons -xe -eestão obsoletos ???
nyxee 9/03

Acredito que isso não seja executado ~/.bashrcantes da execução do comando, conforme solicitado originalmente pelo OP.
IgNite 20/11
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.