Jak mogę utworzyć skrypt, który otwiera okna terminali i wykonuje w nich polecenia?


140

Mam trzy skrypty, które muszę uruchomić, kiedy uruchamiam komputer Ubuntu, uruchamiają one usługi, z których korzystam w moim środowisku programistycznym.

Aby to zrobić, ręcznie otwieram trzy terminale i wpisuję polecenia.

Czy istnieje sposób na utworzenie skryptu, który otworzy trzy terminale i wykona jedno polecenie w każdym z nich? (Każde polecenie powinno znajdować się w osobnym oknie terminala, aby zobaczyć ich dane wyjściowe).

Odpowiedzi:


138
gnome-terminal -e command

lub

xterm -e command

lub

konsole -e command

Dosyć

terminal -e command

Aby terminal pozostał po wyjściu polecenia:

W konsoli jest --nocloseflaga.

W Xterm jest -holdflaga.

W gnome-terminalprzejdź do Edycja -> Preferencje profilu -> Tytuł . Kliknij kartę Polecenie . Wybierz opcję Hold terminal z menu rozwijanego oznaczonego Po wyjściu polecenia . Powinieneś utworzyć do tego nowy profil i uruchomić go przy pomocy

okien terminala --window-z profilem = NAMEOFTHEPROFILE -E poleceń

1
Jeśli spróbuję zatrzymać terminal, otrzymuję „proces potomny kończy się normalnie z kodem statusu 127”
Darshan Chaudhary

2
gnome-terminal nie ma już opcji tytułu :(
törzsmókus

1
@ törzsmókus to rzeczywiście 2017! Wydania LTS mają 5-letni okres wsparcia. 14.04 kończy się do kwietnia 2019 r. Wiki.ubuntu.com/Releases
bhass1

1
gnome-terminal -e commanddziała tylko, jeśli commandjest cytowany. Więc to nie działa: gnome-terminal -e "echo hello world; sleep 3"ale to robi: gnome-terminal -e "bash -c 'echo hello world; sleep 3'". Westchnienie.
bgoodr 16.04.17

3
Możesz także przytrzymać terminal gnome otwarty, dodając ; $SHELLna końcu polecenia. Np .:gnome-terminal --tab --title="test" --command="bash -c 'cd /etc; ls; $SHELL'"
Gabriel Staples,

58

Zamiast sztywnego kodowania gnome-terminal, konsoleet cetera, korzystać z systemu alternatyw. Program, który wykonuje domyślny emulator terminala to:

x-terminal-emulator

W moim systemie otwiera nowe wystąpienie Konsoli za każdym razem, gdy wykonuję to polecenie.

Na szczęście terminale wydają się obsługiwać -eopcję wykonania polecenia (zweryfikowałem to pod kątem konsolei gnome-terminal). Argumenty po poleceniu są przekazywane do wywołanego polecenia. Bash odmawia pozostania otwartym w moim terminalu, potrzebny jest dodatkowy skrypt, aby uzyskać terminal:

#!/bin/sh
"$@"
exec "$SHELL"

Jeśli zapisałeś poprzedni skrypt jako /home/user/hackyi uczyniłeś go wykonywalnym, uruchomisz skrypty za pomocą:

x-terminal-emulator -e /home/user/hacky your-script optional arguments here

Pełna ścieżka jest wymagana i /home/user/hackymusi być wykonywalna.

Poprzednią próbę uruchomienia skryptu w nowym oknie terminala można znaleźć w wersji 2 , zanim zdałem sobie sprawę, że można przekazać argumenty x-terminal-emulator.


W tym przypadku niewiele to pomoże, ponieważ pytający chce zrobić coś, co nie jest takie samo dla wszystkich terminali.
nickguletskii

Próba nr 3: ta powinna pozostawić terminal otwarty i uruchomić program z opcjonalnymi argumentami.
Lekensteyn

1
Użyłem opcji gnome, jednak po uruchomieniu skryptu główny terminal zamyka się !! .. jakiś pomysł dlaczego?
McLan

3
@ Suda.nese To znaczy, zgodnie z projektem, kiedy „terminal” zakończy wykonywanie skryptu, wyjdzie, ponieważ nie ma już nic więcej do roboty. Możesz to „naprawić”, wywołując powłokę, w której możesz wykonywać polecenia ( bash) lub mieć linię taką jak read -p "Press Return to continue".
Lekensteyn,

1
Jak uruchomić więcej niż jedno polecenie w terminalu? Na przykład cd xxx && start.sh. Tłumacz interpretuje && jako drugą część polecenia (co jest logiczne), ale jeśli go zacytuję, to spróbuje wykonać całą sprawę jako jeden wielki argument
Richard

9

Całkiem proste-

#!/bin/bash

/etc/init.d/ccpd status

To wystarcza w przypadku innych poleceń, które nie muszą wyświetlać niczego w terminalu. Ale tutaj trzeba zobaczyć status.
Musi więc działać w oknie terminala

#!/bin/bash

gnome-terminal -e "/etc/init.d/ccpd status"  --window-with-profile=NAMEOFTHEPROFILE

Drugi post miał []być symbolem zastępczym

Tutaj „NAMEOFTHEPROFILE” należy zastąpić nazwą profilu, który „Przechowuje terminal po wyjściu polecenia”.

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj


1
@cipricus uważam, że []był tylko symbolem zastępczym
Karthik T

Rozumiem. ale muszę sprawić, by terminal nie zamykał się tak szybko. myślę, że jest to również powiązane pytanie

@cipricus czy wypróbowałeś już profil? Wystarczy dodać --window-with-profile=NAMEOFTHEPROFILEdo tego, co dałem
Karthik T

1
@cipricus Musiałbym wrócić do domu, aby udzielić lepszych instrukcji, ale pomysł polega na utworzeniu specjalnego profilu z tym zestawem opcji i użyciu nazwy specjalnego profilu w powyższym miejscu.
Karthik T

2
@cipricus, jeśli to ci wystarczy, to jest w porządku. Profil to nic innego jak grupa ustawień. Możesz skonfigurować ustawienia TYLKO do użytku w skrypcie i nie musisz używać go we wszystkich terminalach. Możesz zobaczyć Edycja -> Profile, aby zobaczyć wszystkie profile, które posiadasz, i dodać tam jeden, który został skonfigurowany zgodnie z objaśnieniem w poście, który
podłączyłeś

5

Wspomagany odpowiedzią @ nickguletskii i własnym komentarzem pod jego odpowiedzią oraz zainspirowany oceną @ grabantot mojego komentarza, oto mój ulubiony sposób, aby to zrobić, szczególnie gdy chcę, aby terminal był otwarty, aby móc go następnie ręcznie użyć.

Dawny. użycie: jest to naprawdę przydatne, aby dodać do programów startowych, aby ten skrypt działał, otwierał terminal, tworzył i nazywał kartę w terminalu i uruchamiał polecenie. Lub możesz po prostu dodać symboliczne łącze do tego skryptu na pulpicie. Korzystam z tego rodzaju podejścia, dzięki czemu mogę dwukrotnie kliknąć pojedynczą ikonę na pulpicie i otworzyć kilka terminali (z różnymi kartami nazwanymi zgodnie z tym, co zamierzam w nich wykonać) i programami do skonfigurowania moje środowisko programistyczne, na przykład, do codziennej pracy.

Oto wymyślony przykład, który otwiera pojedynczą kartę, tytułuje ją „test”, a następnie uruchamia w niej proste polecenie cd /etc; ls. $SHELLCzęść na końcu zmusza powłokę pozostać otwarte, dzięki czemu można następnie zobaczyć swoje wyjście i nadal go używać (dowiedziałem to gdzieś indziej na przepełnienie stosu):

gnome-terminal --tab --title="test" --command="bash -c 'cd /etc; ls; $SHELL'"

Oto bardziej skomplikowany przykład, który otwiera 3 oddzielne zakładki w tym samym terminalu gnome. To właśnie robi mój skrót na pulpicie, dzięki czemu mogę jednocześnie otworzyć kilka okien programowania:

gnome-terminal --tab --title="tab 1" --command="bash -c 'cd /etc; ls; $SHELL'" --tab --title="tab 2" --command="bash -c 'cd ~; ls; $SHELL'" --tab --title="tab 3" --command="bash -c 'cd ~/temp3; ls; $SHELL'"

Oto podział tego polecenia powyżej:

  • gnome-terminal = otwórz terminal gnome
  • --tab = otwórz unikalną kartę tego, co będzie dalej
  • --title="tab 1" = tytuł tej zakładki „zakładka 1”
  • --command="bash -c 'cd /etc; ls; $SHELL'"= uruchom bash -c 'cd /etc; ls; $SHELL'polecenie, które właśnie utworzyłem jako przykład; oto co robi:
    • bash -c mówi, że to bash 'c'ommand
    • cd /etc = 'c'hange' d'irectory w ścieżce „/ etc”
    • ls = 'l'i''s zawartość tego katalogu
    • $SHELL= ten tajemniczy smakołyk jest wymagany do utrzymania muszli otwartej, abyś mógł z nią pracować. Jeśli chcesz otworzyć powłokę, uruchom polecenie, a następnie zamknij, po prostu usuń tę część. Chcę jednak, aby karta pozostała otwarta, aby móc tworzyć magię programowania. :)
  • następnie zaczynamy od nowa, --tababy utworzyć zakładkę 2, a następnie ponownie dla zakładki 3. Dostosuj do treści twojego serca.

Zrzut ekranu:

wprowadź opis zdjęcia tutaj


1
Cieszę się, że byłam pomocna) Mam również skrypty, które mogę po prostu kliknąć i rozpocząć pracę nad projektem. Były z nimi dwa problemy: wiele okien terminali (miał dla nich cały osobny ekran) i okna zamykające się na przykład po awarii serwera. Ta odpowiedź rozwiązuje oba moje problemy z --tab + $ SHELL. Nicea
grabantot

1

komentując odpowiedź Lekensteyn. Wiem, że to stary post, ale dla każdego, kto uzna to za przydatne (tak jak właśnie to zrobiłem) Zamiast tworzyć kolejny „hacky skrypt”, po prostu wstawiając funkcję do skryptu, który wywołujesz

hacky_function()
{
"$@"
exec "$SHELL"
}

Wywołaj skrypt za pomocą „x-terminal-emulator -e / path / to / script hacky_function opcjonalne argumenty tutaj”

Nie zapomnij wstawić „$ @” na końcu skryptu


-2

Użyj polecenia screen i -d odłącz od istniejącej sesji screen, i podłącz ponownie tutaj -m wymuś nową sesję screen -S utwórz nazwaną sesję zamiast używać domyślnej nazwy


ta odpowiedź w ogóle nie jest jasna,
staraj

@azerafati rzeczywiście, ekran nie otwierać żadnych okno terminala ... nie jest jeszcze przeznaczony do tego niesamowite pakietu ...
erm3nda
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.