Jak uruchomić xfce-terminal z różnymi poleceniami dla każdej karty i używać kart po powrocie poleceń?

20

Aby zachować przegląd, lubię umieszczać wiele poleceń zawsze w tej samej kolejności i uruchamiać je automatycznie razem (gradle, git, baza danych, scala-REPL, jboss ...)

-H (wstrzymanie) wydaje się oznaczać, że terminal nie jest zamykany po zakończeniu, ale jak mam świadomie zakończyć taki proces? Ani trochę? W taki sposób, że mogę nadal korzystać z terminala.

Używam Xubuntu z XFCE4-terminal i Bash. Czy istnieje lepsze rozwiązanie GUI do uruchamiania wielu poleceń z możliwością kontynuowania pracy w tym oknie / karcie?

Aktualizacja: jeśli nie znasz tych komend: Jboss i grad ciągle produkują dane wyjściowe, których nie chcesz mieszać w tym samym terminalu. A czasem trzeba je przerwać za pomocą ^ C i uruchomić ponownie. Nie lubię ponownie otwierać terminów xfce4 i przechodzić do katalogu, w którym muszę działać.

Baza danych i scala-REPL są interaktywne, więc nie ma sensu uruchamiać ich w tle.

Mój aktualny skrypt startowy po prostu nawiguje do pożądanych katalogów i otwiera wszystkie karty w odpowiedniej kolejności, aby znaleźć je zawsze w tej samej pozycji, nazywając każdą kartę dla swojego celu:

xfce4-terminal -T eclipse   --working-directory=/home/stefan/oximity -e "/opt/eclipse/eclipse" \
    --tab -T arandr --working-directory=/home/stefan/oximity -e "arandr /home/stefan/.screenlayout/oximity.sh" \
    --tab -T bash       --working-directory=/home/stefan/oximity \
    --tab -T gradle     --working-directory=/home/stefan/oximity/med \
    --tab -T git        --working-directory=/home/stefan/oximity/med \
    --tab -T mysql      --working-directory=/opt/mini/mysql \
    --tab -T jboss      --working-directory=/opt/mini/jboss \
    --tab -T jboss-log  --working-directory=/opt/mini/jboss/standalone/log \
    --tab -T scala-REPL --working-directory=/home/stefan/proj/mini/forum -e /opt/scala/bin/scala

Zaćmienie i arandr są odłączane od powłoki i uruchamiane we własnym oknie, więc tam działa parametr -e (execute). Myślę, że dla scala-REPL to działa, ponieważ jest to ostatnie polecenie na liście.

nieznany użytkownik
źródło
Twoje pytanie wciąż jest dla mnie niejasne. Chcesz, aby terminal powrócił do powłoki po zakończeniu polecenia, z którym został uruchomiony? Coś takiego xterm -e 'stuff;bash'?
frostschutz
1
To pytanie wciąż wymaga pracy! Znalazłem ten wątek, myślę, że tego właśnie szuka OP: jak utrzymać xfce4-terminal otwarty? . Chce wiedzieć, jak uzyskać dostęp do karty, na której użyto przełącznika „-H”, i nadal używać go jako zwykłego okna terminala. OP, czy możesz potwierdzić, czy mam rację?
slm
@slm: Tak, lubię pozostawić terminal otwarty, aby przetwarzał dalsze polecenia - po prostu lubię automatycznie uruchamiać pierwsze z moich poleceń i mieć wiele nazwanych zakładek.
użytkownik nieznany

Odpowiedzi:

21

-H/-holdOpcją jest, aby utrzymać otwarte okno emulator terminala raz aplikacje rozpoczęły się w nim (skorupy lub inny) został zakończony. W tym stanie nic więcej nie może się wydarzyć.

Jeśli chcesz uruchomić polecenie jako zadanie powłoki interaktywnej w emulatorze terminali xfce4 i utrzymać działanie powłoki i używać jej interaktywnie po wyjściu z aplikacji bash, możesz użyć $PROMPT_COMMANDzmiennej środowiskowej, aby xfce-terminalrozpocząć interaktywna powłoka, która uruchamia dane polecenie tuż przed pierwszym monitem.

xfce4-terminal \
  -T eclipse \
  --working-directory=/home/stefan/oximity \
  -e 'env PROMPT_COMMAND="unset PROMPT_COMMAND; /opt/eclipse/eclipse" bash' \
  \
  --tab -T arandr \
  --working-directory=/home/stefan/oximity \
  -e 'env PROMPT_COMMAND="unset PROMPT_COMMAND; arandr /home/stefan/.screenlayout/oximity.sh" bash' \
  \
  --tab -T bash \
  --working-directory=/home/stefan/oximity \
  ...

W ten sposób polecenia są zadaniami tej powłoki, co oznacza, że ​​możesz je zawiesić Ctrl-Zi wznowić później, fg/bgtak jakbyś wprowadził je po zachęcie tej interaktywnej powłoki.

Zakłada się jednak, że nie ustawiłeś $PROMPT_COMMANDw swoim ~/.bashrc. Należy również pamiętać, że status wyjścia polecenia nie będzie dostępny w $?.

Aby uczynić to jeszcze bardziej podobnym do polecenia wprowadzonego w wierszu powłoki, możesz nawet dodać je do listy historii. Lubić:

xfce4-terminal -T /etc/motd -e 'env PROMPT_COMMAND="
  unset PROMPT_COMMAND
  history -s vi\ /etc/motd
  vi /etc/motd" bash'

W ten sposób po wyjściu vimożesz nacisnąć Upklawisz, aby przywołać to samo vipolecenie.

Łatwiejszy sposób na napisanie:

PROMPT_COMMAND='unset PROMPT_COMMAND; history -s "$CMD"; eval "$CMD"' \
  xfce4-terminal --disable-server \
          -T /etc/motd -e 'env CMD="vi /etc/motd" bash' \
    --tab -T       top -e 'env CMD=top bash'

:

xfce4-terminal -e 'sh -c "cmd; exec bash"'

rozwiązanie podane w innych odpowiedziach działa, ale ma pewne wady:

  1. Jeśli naciśniesz Ctrl-Cpodczas cmddziałania, to zabije to urządzenie zewnętrzne, shponieważ istnieje tylko jedna grupa procesów dla obu shi cmd.
  2. Nie możesz użyć Ctrl-Zdo zawieszeniacmd
  3. Podobnie jak w $PROMPT_COMMANDpodejściu, status wyjścia polecenia nie będzie dostępny w $?.

Możesz obejść 1 powyżej, wykonując:

xfce4-terminal -e 'sh -c "trap : INT; cmd; exec bash"'

Lub:

xfce4-terminal -e 'sh -ic "cmd; exec bash"'

W tym drugim przypadku możesz także zawiesić proces Ctrl-Z, ale nie będziesz mógł z niego korzystać fg/bg. Będziesz mógł ją kontynuować w tle choć wykonując kill -s CONTna PID z cmd.

Stéphane Chazelas
źródło
Łał. To dość skomplikowane, ale wydaje się, że działa. :) Nie wiem, dlaczego nagroda zniknęła. Niestety nie miałem czasu na sprawdzenie podpowiedzi.
użytkownik nieznany
Naprawdę nie rozumiem wszystkich zasad systemu nagród. Ponieważ uważam, że zasługujesz na nagrodę, zaczynam nową nagrodę.
użytkownik nieznany
Tak, nagrody wygasają po 7 dniach, a ty masz 24 godziny na ich przyznanie. Jeśli ich nie znasz, zostaną przypisani do dowolnego użytkownika, który ma najwyższe powtórzenie (2 lub więcej). Oto więcej niż kiedykolwiek chciałeś wiedzieć o nagrodach
slm
1
@AdrianLopez, w bashskryptach, w ogóle nie ma historii, ponieważ nie ma edycji linii ani interakcji użytkownika, chyba że użyjesz jej read -ew skrypcie (i zobaczysz, że history -s textdziała tam, aby zaliczyć wyświetlaną przez nią historię read -e). Tutaj nie uruchamiamy się history -sze skryptu, ale z $PROMPT_COMMANDhaka interaktywnej powłoki.
Stéphane Chazelas,
1
@ StéphaneChazelas Amazing. Po twojej innej cennej odpowiedzi tutaj , muszę dodać, że xfce4-terminalprzynajmniej wersja 0.6.3 chce teraz dodatkowego parametru - --disable-server- aby przejść przez środowisko. Patrz: list.debian.org/debian-user/2017/10/msg00045.html .
ジ ョ ー ジ
5

O ile rozumiem twoje pytanie, chcesz uruchomić niektóre procesy w terminalu, będąc w stanie CtrlC je + , a następnie pozostawić otwarte okno z powłoką.

Jeśli mam rację, można to zrobić za pomocą następującego polecenia:

xfce4-terminal -e "bash -c 'COMMAND; exec bash'"
Rafael Cavalcanti
źródło
Czy to działa z wieloma kartami?
użytkownik nieznany
@userunknown Pewnie. Po prostu dodaj --tab przed innymi poleceniami. Na przykład, jeśli chcesz uruchomić „ls / etc” i „ls / dev”, wydaj: xfce4-terminal -e „bash -c 'ls / etc; exec bash” „--tab -e” bash - c 'ls / dev; exec bash' "Jeśli używasz Gnome Terminal, musisz napisać --tab również przed pierwszym poleceniem.
Rafael Cavalcanti
Jest to trochę pomocne, choć nie tak daleko, jak się spodziewałem. Kiedy zaczynam gradle z `xfce4-terminal --working-directory = / home / stefan / oximity / med -e" bash -c 'gradle explodedWar explodedWarSync; bash' "` `zakładka jest otwarta, o nazwie, ale pokazuje" gradle: polecenie nieznalezione ”podczas wpisywania polecenia działa poprawnie. Git, mysql i scala działają w ten sposób dobrze, ale dla jbossa Ctrl-C kończy całą kartę jboss. Mogłem tylko przygotować powłokę, zaczynając od tego miejsca - być może powtarzając polecenie do wprowadzenia. Naprawdę nie rozumiem, co tu robi różnice.
użytkownik nieznany
1

wiele aplikacji na xfce4-terminalkartach

Dodanie interaktywnej powłoki do każdej karty xfce

Możesz użyć tego hacka, aby dodać powłokę, jeśli / kiedy masz Ctrl+Ckartę:

$ xfce4-terminal -H \
     --tab -T bash -e "bash -c 'top;bash'" \
     --tab -T git  -e "bash -c 'top;bash'"

To da ci następujące:

   ss xfce w / tabs

   ss z xfce w / top Ctrl + C

slm
źródło
0

Po wyjściu z powłoki bez -Hterminala również zostanie zamknięty. Z tą flagą terminal będzie działał, ale proces powłoki jest zamknięty i nie można go przywrócić.

Myślę, że próbujesz zarchiwizować, że właśnie uruchamiasz terminal i uruchamia się środowisko programistyczne?

Możesz utworzyć skrypt powłoki i umieścić w nim wszystkie swoje polecenia. Na końcu skryptu wystarczy uruchomić powłokę:

#!/bin/sh

gradle &
git &
... &
.... &
jboss &

$SHELL

# some cleanup commands if needed

Następnie wywołaj ten skrypt za pośrednictwem xfce4-terminal -e /the/script. Po wyjściu z$SHELL zakończeniu procesu nadrzędnego (skryptu) zadania w tle otrzymają również sygnał wyjścia i wyjdź.

Jeśli chcesz utrzymać je przy życiu, użyj np. nohup jboss &W skrypcie

krissi
źródło
To nie działa, ponieważ gradle i jboss stale wytwarzają dane wyjściowe. Nie lubisz, gdy miksują swoje wyniki. Baza danych i terminal Scala są interaktywne. Nie ma sensu umieszczać ich w tle. Pomysł otwierania innych poleceń na różnych kartach polega na tym, że historia jest wypełniona tylko kilkoma różnymi poleceniami do jednego tematu, a zatem można je szybko przeglądać.
użytkownik nieznany