Ouvrez un nouvel onglet dans gnome-terminal en utilisant la ligne de commande [fermé]

122

J'utilise Ubuntu 9.04 x64 et quand j'écris:

gnome-terminal --tab

Au niveau du terminal, je m'attends à ce qu'il ouvre un nouvel onglet dans la même fenêtre de terminal. Mais cela ouvre une nouvelle fenêtre à la place.

J'ai découvert que son intention est d'ouvrir un nouvel onglet dans une nouvelle fenêtre, c'est-à-dire si j'écris:

gnome-terminal --tab --tab

Cela ouvrira une nouvelle fenêtre avec deux onglets.

Alors, la question est, comment puis-je ouvrir un nouvel onglet dans la fenêtre actuelle en utilisant une commande dans gnome-terminal?

Vikrant Chaudhary
la source
4
si vous écrivez de toute façon le terminal gnome, pourquoi ne pouvez-vous pas simplement appuyer sur ctrl + shift + t pour ouvrir un nouvel onglet;)
rasjani
13
Et comment suis-je censé appuyer Ctrl+Shift+Tlorsque la commande est exécutée à partir d'un fichier de script? (J'ai entendu dire que quelque chose appelé D-Bus peut le faire)!
Vikrant Chaudhary
19
Chaque fois que je démarre mon PC, je dois ouvrir quelques onglets dans mon gnome-terminal. Et automatiser cela me fera me sentir un peu plus geek. (Comme on dit) La paresse est une fonctionnalité du programmeur.
Vikrant Chaudhary le
@VikrantChaudhary threevirtues.com :-)
jpaugh
Stack Overflow est un site pour les questions de programmation et de développement. Cette question semble hors sujet car elle ne concerne ni la programmation ni le développement. Consultez la rubrique Quels sujets puis-je poser ici dans le centre d'aide. Peut-être que Super User ou Unix & Linux Stack Exchange serait un meilleur endroit pour demander.
jww du

Réponses:

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

Cela déterminera automatiquement le terminal correspondant et ouvrira l'onglet en conséquence.

dubey utkarsh
la source
3
Merci, ça marche bien. En bonne forme -WID= xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)"| awk '{print $5}'; xdotool windowfocus $WID; xdotool key ctrl+shift+t $WID
Vikrant Chaudhary
6
Merci pour la solution. Cependant, je ne sais pas comment exécuter différentes commandes dans différents onglets. Peu importe où j'ajoute les commandes, elles sont toutes exécutées dans le premier onglet. Pouvez-vous inclure une solution pour cela?
Calin
10
@Calin permet sleep 1; xdotool type --delay 1 --clearmodifiers "your Command"; xdotool key Return;d'exécuter une commande.
user13107
2
Pourquoi le bit WID et windowfocus? La fenêtre ne sera-t-elle pas déjà focalisée?
Chris Morgan
1
Où dois-je placer ce script?
Dawoodjee
69

Vous pouvez également demander à chaque onglet d'exécuter une commande set.

gnome-terminal --tab -e "tail -f somefile" --tab -e "some_other_command"
Chase Seibert
la source
11
J'obtiens "Une erreur s'est produite lors de la création du processus enfant pour ce terminal" en réponse àgnome-terminal --tab -e "cd /tmp"
Hedgehog
3
@Hedgehog, j'ai un moyen pour que: gnome-terminal --tab --working-directory="/home/user/X/Y/". Je ne sais pas pourquoi, mais "~/X/Y/"n'a pas fonctionné.
glarrain
1
J'ai des problèmes avec mes commandes, si j'utilise seulement --tab ça marche mais si j'utilise --tab -e "my_bash_shorcut" ça ne marche pas. Est-ce que tu sais pourquoi?
Adrian Matteo
@AdrianMatteo Un peu tard, mais je pense que je l'ai compris: si vous créez deux fichiers avec du charabia puis exécutez cette commande gnome-terminal --tab -e "tail -f file_a" --tab -e "tail -f file_b", le terminal gnome s'ouvrira avec deux onglets où chaque onglet aura un contenu de fichier respectif, mais fermera le au moment où vous envoyez ^ C. Cela vous montre pourquoi cela ne fonctionne pas, mais je ne sais pas comment y remédier.
IDDQD
@AdrianMatteo Voir stackoverflow.com/questions/17402152/…
Klaus
8

J'ai trouvé le moyen le plus simple:

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

J'utilise tmuxau lieu d'utiliser directement le terminal. Donc, ce que je veux, c'est vraiment un fichier de commande / shell unique et simple pour construire le développement envavec plusieurs tmuxfenêtres. Le code shell est comme ci-dessous:

#!/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
la source
Ces citations 'command 1'fonctionnent mieux que les guillemets doubles qui ne fonctionnent pour moi que lorsque je spécifie également--working-directory="/some/path/"
Barry Staes
4

Version un peu plus élaborée (à utiliser depuis une autre fenêtre):

#!/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 #
jno
la source
2

Juste au cas où tu voudrais ouvrir

  • une nouvelle fenêtre
  • avec deux onglets
  • et exécuter la commande là-dedans
  • et les faire rester ouverts ...

Voici:

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"

(même chose pour mate-terminalbtw.)

Frank Nocke
la source
Fonctionne de la même manière pour xfce4-terminalbtw. Laquelle de ces commandes est réellement responsable du point and having them stay open...? Je demande parce que cela n'est pas mentionné dans la page de xfce4-terminal
manuel
1

Pour rassembler un certain nombre de points différents ci-dessus, voici un script qui exécutera tous les arguments passés au 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;

Ensuite, rendez-le exécutable: chmod +x new_tab.sh

Vous pouvez maintenant l'utiliser pour exécuter ce que vous voulez dans un nouvel onglet: ./new_tab.sh "watch ls -l"

NeoGeek
la source
0

Je n'ai pas installé gnome-terminal mais vous devriez pouvoir le faire en utilisant un appel DBUS sur la ligne de commande en utilisant dbus-send .

Mike McQuaid
la source
0

Pensez à utiliser Roxterm à la place.

roxterm --tab

ouvre un onglet dans la fenêtre actuelle.

user25643
la source
0

Pour tous ceux qui recherchent une solution qui n'utilise pas la ligne de commande: ctrl + shift + t

Jemini
la source
10
Ils demandent la ligne de commande., Pour automatiser les choses. Ces raccourcis aident rarement.
Muthu Ganapathy Nathan
c'était exactement ce que je cherchais. La question dans le titre ne se limite pas aux «solutions automatisées» @EAGER_STUDENT et pour être honnête, j'ai du mal à trouver un cas d'utilisation où j'ai besoin d'une interface graphique automatisée. C'est comme faire une chirurgie à cœur ouvert à travers la colonne vertébrale.
Steffen Winkler
6
@SteffenWinkler Je suis heureux que la solution vous ait aidé. Mais comme la question disait `` en utilisant la ligne de commande '', j'ai supposé utiliser des commandes automatisées, quelque chose comme les réponses aux votes élevés ... Quoi qu'il en soit, la réponse elle-même clarifie `` Pour tous ceux qui recherchent une solution qui n'utilise pas la ligne de commande '' .... Félicitations à la réponse .... De plus, «J'ai du mal à trouver un cas d'utilisation où j'ai besoin d'une interface graphique automatisée.» Dit toujours que j'ai besoin de 5 onglets à ouvrir au démarrage. Dans ce cas, ce serait utile. Mais dans ce cas aussi, nous pouvons utiliser un raccourci pour automatiser de toute façon;)
Muthu Ganapathy Nathan
2
Exemple où j'ai besoin d'une ouverture d'onglet automatisée; J'automatise des scripts de démarrage sur un robot et je souhaite ouvrir des onglets pour exécuter des commandes afin que, lorsque les processus se bloquent (comme ils le font tous), je puisse ssh depuis mon ordinateur portable et jeter un œil à la sortie du journal sur les consoles sans fouiller dans les répertoires des fichiers journaux.
WillC
-2

Pour ouvrir plusieurs onglets dans la même fenêtre de terminal, vous pouvez utiliser la solution suivante.

Exemple de script:

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
la source
1
On dirait que c'est une réponse très centrée sur OSX lorsque la question concerne clairement le terminal (gnome) sous Linux. osascriptest OSX (Apple)
nhed le
@nhed: Merci - ça répond à mon qu'est - ce que c'est que ça? réponse à cette réponse. Pallavi: Même si la question concernait Mac, le codage en dur de votre propre chemin d'accès personnel ne rend pas votre réponse très utile. Je vous suggère d'utiliser la $HOMEvariable d'environnement, ou l'équivalent OSX s'il est différent.
Michael Scheper