Abra uma nova guia no gnome-terminal usando a linha de comando [fechada]

122

Estou usando o Ubuntu 9.04 x64 e quando escrevo:

gnome-terminal --tab

No terminal, espero abrir uma nova guia na mesma janela do terminal. Mas abre uma nova janela.

Eu descobri que sua intenção é abrir uma nova guia em uma nova janela, ou seja, se eu escrever:

gnome-terminal --tab --tab

Ele abrirá uma nova janela com duas guias.

Portanto, a questão é: como posso abrir uma nova guia na janela atual usando um comando in gnome-terminal?

Vikrant Chaudhary
fonte
4
se você estiver escrevendo o de qualquer maneira gnome-terminal, por que não pode você apenas pressione Ctrl + Shift + T para abrir uma nova guia;)
rasjani
13
E como devo pressionar Ctrl+Shift+Tquando o comando está sendo executado a partir de um arquivo de script? (Ouvi algo chamado D-Bus pode fazer isso)!
Vikrant Chaudhary
19
Sempre que inicio o PC, preciso abrir algumas abas no meu terminal gnome. E automatizar isso me fará sentir um pouco mais nerd. (Como se costuma dizer) Preguiça é um recurso do programador.
Vikrant Chaudhary
@VikrantChaudhary threevirtues.com :-)
jpaugh
Stack Overflow é um site para perguntas sobre programação e desenvolvimento. Esta questão parece estar fora de tópico, porque não se trata de programação ou desenvolvimento. Consulte Quais tópicos posso perguntar aqui na Central de Ajuda. Talvez o Superusuário ou o Unix e Linux Stack Exchange sejam um lugar melhor para perguntar.
JWW

Respostas:

70
#!/bin/sh

WID=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)"| awk '{print $5}')
xdotool windowfocus $WID
xdotool key ctrl+shift+t
wmctrl -i -a $WID

Isso determinará automaticamente o terminal correspondente e abrirá a guia adequadamente.

utkarsh dubey
fonte
3
Obrigado, funciona bem. De forma adequada - #WID= xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)"| awk '{print $5}'; xdotool windowfocus $WID; xdotool key ctrl+shift+t $WID
234 Vikrant Chaudhary
6
Obrigado pela solução. No entanto, não está claro para mim como posso executar comandos diferentes em guias diferentes. Não importa onde eu adiciono os comandos, todos eles são executados na primeira guia. Você pode incluir uma solução para isso?
Calin
10
O @Calin usa sleep 1; xdotool type --delay 1 --clearmodifiers "your Command"; xdotool key Return;para executar um comando.
user13107
2
Por que o WID e o foco da janela pouco? A janela já não estará focada?
Chris Morgan
1
Onde coloco esse script?
Dawoodjee
69

Você também pode fazer com que cada guia execute um comando set.

gnome-terminal --tab -e "tail -f somefile" --tab -e "some_other_command"
Chase Seibert
fonte
11
Recebo 'Ocorreu um erro ao criar o processo filho para este terminal' em resposta agnome-terminal --tab -e "cd /tmp"
Hedgehog
3
@Hedgehog, eu tenho uma maneira para que: gnome-terminal --tab --working-directory="/home/user/X/Y/". Eu não sei por que, mas "~/X/Y/"não funcionou.
glarrain
1
Estou tendo problemas com meus comandos, se eu usar apenas --tab ele funciona, mas se eu usar --tab -e "my_bash_shorcut", ele não funcionará. Você sabe por quê?
Adrian Matteo
@AdrianMatteo Um pouco tarde, mas acho que descobri: se você criar dois arquivos com rabiscos e depois executar este comando gnome-terminal --tab -e "tail -f file_a" --tab -e "tail -f file_b", o terminal gnome abrirá com duas abas, onde cada aba terá o respectivo conteúdo, mas fechará o arquivo momento em que você envia ^ C. Isso mostra por que não funciona, mas não sei como remediar isso.
IDDQD
@AdrianMatteo Veja stackoverflow.com/questions/17402152/…
Klaus
8

Eu encontrei a maneira mais simples:

gnome-terminal --tab -e 'command 1' --tab -e 'command 2'

Eu uso em tmuxvez de usar o terminal diretamente. Então, o que eu quero é realmente um arquivo de comando / shell único e simples para construir o desenvolvimento envcom várias tmuxjanelas. O código do shell é o seguinte:

#!/bin/bash
tabs="adb ana repo"
gen_params() {

    local params=""
    for tab in ${tabs}
    do  
        params="${params} --tab -e 'tmux -u attach-session -t ${tab}'"
    done
    echo "${params}"
}
cmd="gnome-terminal $(gen_params)"
eval $cmd
jaogoy
fonte
Estas citações 'command 1'funcionam melhor do que as aspas que só trabalho para mim quando eu também especificar--working-directory="/some/path/"
Barry Staes
4

Uma versão um pouco mais elaborada (para usar em outra janela):

#!/bin/bash

DELAY=3

TERM_PID=$(echo `ps -C gnome-terminal -o pid= | head -1`) # get first gnome-terminal's PID
WID=$(wmctrl -lp | awk -v pid=$TERM_PID '$3==pid{print $1;exit;}') # get window id

xdotool windowfocus $WID
xdotool key alt+t # my key map
xdotool sleep $DELAY # it may take a while to start new shell :(
xdotool type --delay 1 --clearmodifiers "$@"
xdotool key Return

wmctrl -i -a $WID # go to that window (WID is numeric)

# vim:ai
# EOF #
não
fonte
2

Apenas no caso, você deseja abrir

  • uma nova janela
  • com duas abas
  • e executando comando lá
  • e tê-los ficar abertos ...

aqui está:

gnome-terminal --geometry=73x16+0+0 --window \
  --working-directory=/depot --title='A' --command="bash -c ls;bash" \
  --tab --working-directory=/depot/kn --title='B' --command="bash -c ls;bash"

(o mesmo para mate-terminalbtw.)

Frank Nocke
fonte
Funciona da mesma forma para xfce4-terminalbtw. Qual desses comandos é realmente responsável pelo argumento and having them stay open...? Estou perguntando, porque isso não é mencionado na página de manual pelo menos paraxfce4-terminal
Jankapunkt
1

Para reunir vários pontos diferentes acima, aqui está um script que executará todos os argumentos passados ​​para o script vim new_tab.sh:

#!/bin/bash
#
# Dependencies:
#   sudo apt install xdotool

WID=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)"| awk '{print $5}')
xdotool windowfocus $WID
xdotool key ctrl+shift+t
wmctrl -i -a $WID
sleep 1; xdotool type --delay 1 --clearmodifiers "$@"; xdotool key Return;

Em seguida, torne-o executável: chmod +x new_tab.sh

Agora você pode usá-lo para executar o que quiser em uma nova guia: ./new_tab.sh "watch ls -l"

NeoGeek
fonte
0

Eu não tenho o gnome-terminal instalado, mas você poderá fazer isso usando uma chamada DBUS na linha de comando usando o dbus-send .

Mike McQuaid
fonte
0

Considere usar o Roxterm.

roxterm --tab

abre uma guia na janela atual.

user25643
fonte
0

Para quem procura uma solução que não use a linha de comando: ctrl + shift + t

Jemini
fonte
10
Eles estão pedindo linha de comando., Para automatizar as coisas. Esses atalhos raramente ajudam.
Muthu Ganapathy Nathan
era exatamente o que eu estava procurando. A pergunta no título não se limita a 'soluções automatizadas' @EAGER_STUDENT e, para ser sincero, acho difícil criar um caso de uso em que eu precise de uma GUI automatizada. É como fazer uma cirurgia cardíaca aberta na coluna vertebral.
Steffen Winkler
6
@SteffenWinkler Estou feliz que a solução tenha ajudado você. Mas como a pergunta dizia 'usando a linha de comando', assumi o uso de alguns comandos automatizados, algo como as respostas mais votadas ... De qualquer forma, a resposta em si esclarece 'Para quem procura uma solução que não use a linha de comando' ... Parabéns pela resposta .... Além disso, 'Acho difícil criar um caso de uso em que eu precise de uma GUI automatizada. Sempre precisamos de 5 guias para serem abertas na inicialização. Nesse caso, seria útil. Mas, nesse caso, também podemos usar atalho para automatizar qualquer maneira;)
Muthu Ganapathy Nathan
2
Exemplo em que eu preciso abrir abas automaticamente; Estou automatizando scripts de inicialização em um robô e quero abrir guias para executar comandos, para que, quando os processos falhem (como todos acabam), eu possa transferir o ssh do meu laptop e dar uma olhada na saída do log nos consoles. sem procurar nos diretórios dos arquivos de log.
WillC
-2

Para abrir várias guias na mesma janela do terminal, você pode seguir a seguinte solução.

Script de exemplo:

pwd='/Users/pallavi/Documents/containers/platform241/etisalatwallet/api-server-tomcat-7/bin'
pwdlog='/Users/pallavi/Documents/containers/platform241/etisalatwallet/api-server-tomcat-7/logs'
pwd1='/Users/pallavi/Documents/containers/platform241/etisalatwallet/core-server-jboss-7.2/bin'
logpwd1='/Users/pallavi/Documents/containers/platform241/etisalatwallet/core-server-jboss-7.2/standalone/log'

osascript -e "tell application \"Terminal\"" \

-e "tell application \"System Events\" to keystroke \"t\" using {command down}" \
-e "do script \"cd $pwd\" in front window" \
-e "do script \"./startup.sh\" in front window" \
-e "tell application \"System Events\" to keystroke \"t\" using {command down}" \
-e "do script \"cd $pwdlog\" in front window" \
-e "do script \"tail -f catalina.out \" in front window" \
-e "tell application \"System Events\" to keystroke \"t\" using {command down}" \
-e "do script \"cd $pwd1\" in front window" \
-e "do script \"./standalone.sh\" in front window" \
-e "tell application \"System Events\" to keystroke \"t\" using {command down}" \
-e "do script \"cd $logpwd1\" in front window" \
-e "do script \"tail -f core.log \" in front window" \
-e "end tell"
> /dev/null 
Pallavi Varne
fonte
1
Parece que essa é uma resposta muito centrada no OSX quando a pergunta é claramente sobre o terminal (gnome) no linux. osascripté OSX (Apple)
encerrou em 9/17
@ nhed: Obrigado - isso me responde o que diabos é isso? resposta a esta resposta. Pallavi: Mesmo se a pergunta fosse sobre Mac, codificar seu próprio caminho de casa não torna sua resposta muito útil. Sugiro que você use a $HOMEvariável de ambiente ou o equivalente OSX, se for diferente.
Michael Scheper