Otwórz nową kartę w gnome-terminalu za pomocą wiersza poleceń [zamknięte]

122

Używam Ubuntu 9.04 x64 i kiedy piszę:

gnome-terminal --tab

Na terminalu oczekuję, że otworzy nową kartę w tym samym oknie terminala. Ale zamiast tego otwiera nowe okno.

Dowiedziałem się, że jego zamiarem jest otwarcie nowej zakładki w nowym oknie czyli jak napiszę:

gnome-terminal --tab --tab

Otworzy się nowe okno z dwiema zakładkami.

Powstaje więc pytanie, w jaki sposób mogę otworzyć nową kartę w bieżącym oknie za pomocą polecenia w gnome-terminal?

Vikrant Chaudhary
źródło
4
jeśli i tak piszesz do terminala gnome, dlaczego nie możesz po prostu nacisnąć ctrl + shift + t, aby otworzyć nową kartę;)
rasjani
13
A jak mam naciskać, Ctrl+Shift+Tgdy polecenie jest uruchamiane z pliku skryptu? (Słyszałem, że coś, co nazywa się D-Bus, może to zrobić)!
Vikrant Chaudhary
19
Za każdym razem, gdy uruchamiam komputer, muszę otworzyć kilka zakładek w moim terminalu gnome. I automatifying , które sprawiają, że czuję się trochę bardziej naukowy. (Jak mówią) Lenistwo to cecha programisty.
Vikrant Chaudhary
@VikrantChaudhary threevirtues.com :-)
jpaugh
Stack Overflow to witryna zawierająca pytania dotyczące programowania i programowania. To pytanie wydaje się być niezwiązane z tematem, ponieważ nie dotyczy programowania ani programowania. Zobacz, o jakie tematy mogę zapytać w Centrum pomocy. Być może lepszym miejscem do zadawania pytań będzie Super User lub Unix & Linux Stack Exchange .
jww

Odpowiedzi:

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

Spowoduje to automatyczne określenie odpowiedniego terminala i odpowiednie otwarcie karty.

utkarsh dubey
źródło
3
Dzięki, działa dobrze. W odpowiedniej formie -WID= xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)"| awk '{print $5}'; xdotool windowfocus $WID; xdotool key ctrl+shift+t $WID
Vikrant Chaudhary
6
Dzięki za rozwiązanie. Chociaż nie jest dla mnie jasne, jak mogę wykonywać różne polecenia w różnych zakładkach. Bez względu na to, gdzie dodam polecenia, wszystkie zostaną wykonane na pierwszej karcie. Czy możesz dołączyć rozwiązanie tego problemu?
Calin
10
@Calin służy sleep 1; xdotool type --delay 1 --clearmodifiers "your Command"; xdotool key Return;do uruchamiania polecenia.
user13107
2
Dlaczego WID i bit windowfocus? Czy okno nie będzie już skupione?
Chris Morgan
1
Gdzie mam umieścić ten skrypt?
Dawoodjee
69

Możesz także kazać każdej karcie uruchomić polecenie set.

gnome-terminal --tab -e "tail -f somefile" --tab -e "some_other_command"
Ścigaj Seiberta
źródło
11
Otrzymuję komunikat „Wystąpił błąd podczas tworzenia procesu potomnego dla tego terminala” w odpowiedzi nagnome-terminal --tab -e "cd /tmp"
Jeż
3
@Hedgehog, mam na to sposób: gnome-terminal --tab --working-directory="/home/user/X/Y/". Nie wiem dlaczego, ale "~/X/Y/"nie zadziałało.
glarrain
1
Mam problem z moimi poleceniami, jeśli używam tylko --tab, to działa, ale jeśli używam --tab -e "my_bash_shorcut", nie działa. Wiesz dlaczego?
Adrian Matteo
@AdrianMatteo Trochę późno, ale myślę, że to rozgryzłem: jeśli utworzysz dwa pliki z bełkotem, a następnie uruchomisz to polecenie gnome-terminal --tab -e "tail -f file_a" --tab -e "tail -f file_b", terminal gnome otworzy się z dwiema zakładkami, w których każda karta będzie miała odpowiednią zawartość pliku, ale zamknie w momencie wysłania ^ C. To pokazuje, dlaczego to nie działa, ale nie wiem, jak temu zaradzić.
IDDQD
@AdrianMatteo Zobacz stackoverflow.com/questions/17402152/…
Klaus
8

Znalazłem najprostszy sposób:

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

używam tmux zamiast bezpośrednio używać terminala. Więc to, czego chcę, to naprawdę pojedynczy i prosty plik polecenia / powłoki, aby zbudować program envz kilkoma tmuxoknami. Kod powłoki jest następujący:

#!/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
źródło
Te cytaty 'command 1'działają lepiej niż podwójne cudzysłowy, które działają dla mnie tylko wtedy, gdy podam również--working-directory="/some/path/"
Barry Staes
4

Nieco bardziej rozbudowana wersja (do użycia z innego okna):

#!/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
źródło
2

Na wszelki wypadek chcesz otworzyć

  • nowe okno
  • z dwiema zakładkami
  • i wykonuję tam polecenie
  • i żeby były otwarte ...

proszę bardzo:

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"

(tak przy mate-terminalokazji)

Frank Nocke
źródło
Przy xfce4-terminalokazji działa to samo . Które z tych poleceń faktycznie odpowiada za ten punkt and having them stay open...? Pytam, ponieważ nie ma o tym wzmianki na stronie podręcznika przynajmniej dlaxfce4-terminal
Jankapunkt
1

Aby zebrać kilka różnych punktów powyżej, oto skrypt, który uruchomi wszystkie argumenty przekazane do skryptu 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;

Następnie uczyń go wykonywalnym: chmod +x new_tab.sh

Teraz możesz go użyć do uruchomienia, co chcesz, w nowej karcie: ./new_tab.sh "watch ls -l"

NeoGeek
źródło
0

Nie mam zainstalowanego gnome-terminal, ale powinieneś być w stanie to zrobić, używając wywołania DBUS w linii poleceń, używając dbus-send .

Mike McQuaid
źródło
0

Zamiast tego rozważ użycie Roxterm.

roxterm --tab

otwiera kartę w bieżącym oknie.

user25643
źródło
0

Dla każdego, kto szuka rozwiązania, które nie korzysta z wiersza poleceń: ctrl + shift + t

Jemini
źródło
10
Proszą linię poleceń, aby zautomatyzować te rzeczy. Te skróty rzadko pomagają.
Muthu Ganapathy Nathan
to było dokładnie to, czego szukałem. Pytanie w tytule nie ogranicza się do „zautomatyzowanych rozwiązań” @EAGER_STUDENT i szczerze mówiąc, trudno mi wymyślić przypadek użycia, w którym potrzebuję zautomatyzowanego GUI. To jak operacja na otwartym sercu przez kręgosłup.
Steffen Winkler
6
@SteffenWinkler Cieszę się, że rozwiązanie Ci pomogło. Ale ponieważ pytanie brzmiało `` używając wiersza poleceń '', założyłem, że używam niektórych zautomatyzowanych poleceń, czegoś w rodzaju odpowiedzi, które zostały wysoko ocenione ... W każdym razie sama odpowiedź wyjaśnia `` Dla każdego, kto szuka rozwiązania, które nie korzysta z wiersza poleceń '' .... Uznanie za odpowiedź… Co więcej, „Trudno mi wymyślić przypadek użycia, w którym potrzebuję automatycznego graficznego interfejsu użytkownika”. Zawsze potrzebuję 5 zakładek do otwarcia podczas uruchamiania. W takim przypadku byłoby to przydatne. Ale w tym przypadku i tak możemy użyć skrótu do automatyzacji;)
Muthu Ganapathy Nathan,
2
Przykład, w którym potrzebuję automatycznego otwierania kart; Automatyzuję skrypty startowe na robocie i chcę otwierać karty, aby uruchamiać polecenia, aby po awarii procesów (tak jak wszystkie ostatecznie robią) mogę ssh wejść z mojego laptopa i spojrzeć na dane wyjściowe dziennika na konsolach bez przeszukiwania katalogów plików dziennika.
WillC
-2

Aby otworzyć wiele kart w tym samym oknie terminala, możesz skorzystać z następującego rozwiązania.

Przykładowy skrypt:

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
źródło
1
Wygląda na to, że jest to odpowiedź bardzo skoncentrowana na OSX, gdy pytanie wyraźnie dotyczy (gnome) terminala w systemie Linux. osascriptto OSX (Apple)
nhed
@nhed: Dzięki - to odpowiada na moje pytanie, co to jest? odpowiedź na tę odpowiedź. Pallavi: Nawet jeśli pytanie dotyczyło Maca, zakodowanie własnej ścieżki do domu nie sprawia, że ​​odpowiedź jest bardzo pomocna. Sugeruję użycie $HOMEzmiennej środowiskowej lub odpowiednika OSX, jeśli jest inny.
Michael Scheper