Öffnen Sie eine neue Registerkarte im Gnome-Terminal über die Befehlszeile [geschlossen]


122

Ich benutze Ubuntu 9.04 x64 und wenn ich schreibe:

gnome-terminal --tab

Ich erwarte, dass am Terminal eine neue Registerkarte im selben Terminalfenster geöffnet wird. Stattdessen wird ein neues Fenster geöffnet.

Ich fand heraus, dass es beabsichtigt ist, einen neuen Tab in einem neuen Fenster zu öffnen, dh wenn ich schreibe:

gnome-terminal --tab --tab

Es wird ein neues Fenster mit zwei Registerkarten geöffnet.

Die Frage ist also, wie ich mit einem Befehl in eine neue Registerkarte im aktuellen Fenster öffnen kann gnome-terminal.


4
Wenn Sie das Gnome-Terminal trotzdem schreiben, warum können Sie nicht einfach Strg + Umschalt + t drücken, um einen neuen Tab zu öffnen;)
rasjani

13
Und wie soll ich drücken, Ctrl+Shift+Twenn der Befehl aus einer Skriptdatei ausgeführt wird? (Ich habe gehört, dass etwas namens D-Bus das kann)!
Vikrant Chaudhary

19
Immer wenn ich meinen PC starte, muss ich ein paar Registerkarten in meinem Gnome-Terminal öffnen. Und wenn ich das automatisiere , fühle ich mich ein bisschen geekiger. (Wie sie sagen) Faulheit ist ein Programmiermerkmal.
Vikrant Chaudhary

@ VikrantChaudhary threevirtues.com :-)
jpaugh

Stack Overflow ist eine Site für Programmier- und Entwicklungsfragen. Diese Frage scheint nicht zum Thema zu gehören, da es nicht um Programmierung oder Entwicklung geht. Weitere Informationen zu Themen finden Sie hier in der Hilfe. Vielleicht ist Super User oder Unix & Linux Stack Exchange ein besserer Ort, um zu fragen.
JWW

Antworten:


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

Dadurch wird das entsprechende Terminal automatisch ermittelt und die Registerkarte entsprechend geöffnet.


3
Danke, funktioniert gut. In der richtigen Form -WID= xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)"| awk '{print $5}'; xdotool windowfocus $WID; xdotool key ctrl+shift+t $WID
Vikrant Chaudhary

6
Danke für die Lösung. Mir ist jedoch nicht klar, wie ich verschiedene Befehle auf verschiedenen Registerkarten ausführen kann. Egal wo ich die Befehle hinzufüge, sie werden alle auf der ersten Registerkarte ausgeführt. Können Sie eine Lösung dafür angeben?
Calin

10
@Calin verwenden sleep 1; xdotool type --delay 1 --clearmodifiers "your Command"; xdotool key Return;, um einen Befehl auszuführen.
user13107

2
Warum das WID- und Fensterfokus-Bit? Wird das Fenster nicht schon fokussiert sein?
Chris Morgan

1
Wo platziere ich dieses Skript?
Dawoodjee

69

Sie können auch festlegen, dass auf jeder Registerkarte ein Set-Befehl ausgeführt wird.

gnome-terminal --tab -e "tail -f somefile" --tab -e "some_other_command"

11
Als Antwort aufgnome-terminal --tab -e "cd /tmp"
Hedgehog

3
@ Hedgehog, ich habe einen Weg dafür : gnome-terminal --tab --working-directory="/home/user/X/Y/". Ich weiß nicht warum, aber es "~/X/Y/"hat nicht funktioniert.
Glarrain

1
Ich habe Probleme mit meinen Befehlen. Wenn ich nur --tab verwende, funktioniert es, aber wenn ich --tab -e "my_bash_shorcut" verwende, funktioniert es nicht. Weißt du, warum?
Adrian Matteo

@AdrianMatteo Ein bisschen spät, aber ich denke, ich habe es herausgefunden: Wenn Sie zwei Dateien mit Kauderwelsch erstellen und dann diesen Befehl ausführen gnome-terminal --tab -e "tail -f file_a" --tab -e "tail -f file_b", wird das Gnome-Terminal mit zwei Registerkarten geöffnet, auf denen jede Registerkarte den entsprechenden Dateiinhalt enthält, die jedoch geschlossen wird Moment, in dem Sie senden ^ C. Dies zeigt Ihnen, warum es nicht funktioniert, aber ich weiß nicht, wie ich das beheben kann.
IDDQD


8

Ich habe den einfachsten Weg gefunden:

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

Ich benutze tmuxstatt Terminal direkt. Was ich also möchte, ist wirklich eine einzelne und einfache Befehls- / Shell-Datei, um die Entwicklung envmit mehreren tmuxFenstern zu erstellen . Der Shell-Code lautet wie folgt:

#!/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

Diese Anführungszeichen 'command 1'funktionieren besser als doppelte Anführungszeichen, die nur für mich funktionieren, wenn ich auch spezifiziere--working-directory="/some/path/"
Barry Staes

4

Eine etwas aufwendigere Version (zur Verwendung aus einem anderen Fenster):

#!/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 #

2

Nur für den Fall, dass Sie öffnen möchten

  • ein neues Fenster
  • mit zwei Registerkarten
  • und Befehl dort ausführen
  • und sie offen bleiben lassen ...

Bitte schön:

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"

( mate-terminalÜbrigens auch.)


Funktioniert xfce4-terminalübrigens genauso. Welcher dieser Befehle ist tatsächlich für den Punkt verantwortlich and having them stay open...? xfce4-terminal
Ich frage

1

Um eine Reihe verschiedener Punkte oben zusammenzuführen, ist hier ein Skript, das alle an das Skript übergebenen Argumente ausführt 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;

Als nächstes machen Sie es ausführbar: chmod +x new_tab.sh

Jetzt können Sie damit in einem neuen Tab ausführen, was Sie möchten: ./new_tab.sh "watch ls -l"



0

Verwenden Sie stattdessen Roxterm.

roxterm --tab

öffnet eine Registerkarte im aktuellen Fenster.


0

Für alle, die eine Lösung suchen, die die Befehlszeile nicht verwendet: Strg + Umschalt + t


10
Sie bitten die Kommandozeile, die Dinge zu automatisieren. Diese Verknüpfungen helfen selten.
Muthu Ganapathy Nathan

das war genau das, wonach ich gesucht habe. Die Frage im Titel beschränkt sich nicht nur auf "automatisierte Lösungen" @EAGER_STUDENT. Um ehrlich zu sein, fällt es mir schwer, einen Anwendungsfall zu finden, bei dem ich eine automatisierte Benutzeroberfläche benötige. Das ist wie eine Operation am offenen Herzen durch die Wirbelsäule.
Steffen Winkler

6
@SteffenWinkler Ich bin froh, dass die Lösung Ihnen geholfen hat. Aber da die Frage "Verwenden der Befehlszeile" lautete, nahm ich an, einige automatisierte Befehle zu verwenden, etwa die Antworten mit hohen Stimmen ... Wie auch immer, die Antwort selbst verdeutlicht "Für alle, die eine Lösung suchen, die die Befehlszeile nicht verwendet" .... Ein großes Lob an die Antwort ... Außerdem fällt es mir schwer, einen Anwendungsfall zu finden, bei dem ich eine automatisierte Benutzeroberfläche benötige. Ich brauche immer 5 Registerkarten, die beim Start geöffnet werden müssen. In diesem Fall wäre es nützlich. Aber auch in diesem Fall können wir die Verknüpfung verwenden, um trotzdem zu automatisieren;)
Muthu Ganapathy Nathan

2
Beispiel, bei dem ich das automatische Öffnen von Registerkarten benötige; Ich automatisiere Startskripte auf einem Roboter und möchte Registerkarten öffnen, um Befehle auszuführen, damit ich beim Absturz der Prozesse (wie sie alle letztendlich tun) von meinem Laptop aus ssh kann und mir die Protokollausgabe auf den Konsolen ansehen kann ohne die Protokolldateiverzeichnisse zu durchsuchen.
WillC

-2

Wenn Sie mehrere Registerkarten in demselben Terminalfenster öffnen möchten, können Sie die folgende Lösung wählen.

Beispielskript:

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 

1
Klingt so, als wäre dies eine sehr OSX-zentrierte Antwort, wenn die Frage eindeutig das (Gnom-) Terminal unter Linux betrifft. osascriptist OSX (Apple)
nhed

@nhed: Danke - das antwortet mir was um alles in der Welt ist das? Antwort auf diese Antwort. Pallavi: Selbst wenn es um Mac ging, macht die Hardcodierung Ihres eigenen Heimpfads Ihre Antwort nicht sehr hilfreich. Ich schlage vor, Sie verwenden die $HOMEUmgebungsvariable oder das OSX-Äquivalent, wenn es anders ist.
Michael Scheper
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.