Jak mogę aktywować TMUX za każdym razem, gdy rozpoczynam nową sesję powłoki?

Zamiast za każdym razem wpisywać tmux, Jak mogę mieć tmux zawsze używane dla nowych okien sesji ?

Więc jeśli nie mam otwartych okien terminala, a potem otwieram jeden, to jak ta pierwsza sesja może być w tmux?

Może coś w tym stylu?
Author: prayagupd, 2012-06-17

11 answers

Ostrzeżenie Może to teraz "uszkodzić" (uniemożliwić otwarcie okna terminala - co nie jest dobre!) Twoje loginy Ubuntu. Używaj ze szczególną ostrożnością i upewnij się, że masz drugie konto administratora na komputerze, na które możesz się zalogować, jeśli masz te same problemy, które zrobiłem. Zobacz moją odpowiedź other Po Więcej szczegółów i inne podejście.

Biorąc pod uwagę to Ostrzeżenie, najprostszym rozwiązaniem może być dołączenie tmux inwokacji do końca .bashrc, np.

alias g="grep"
alias ls="ls --color=auto"

# ...other stuff...

if [[ ! $TERM =~ screen ]]; then
    exec tmux
fi

Zauważ, że exec oznacza, że proces bash, który rozpoczyna się po otwarciu terminala, jest zastąpiony przez tmux, więc Ctrl-B D (tzn. odłącz od tmux) faktycznie zamyka okno, zamiast wracać do oryginalnego procesu bash, co jest prawdopodobnie zachowaniem, które chcesz zachować?

Wymagane jest również polecenie if (wykrywa, czy bieżące okno bash jest już w procesie tmux) w przeciwnym razie za każdym razem, gdy uruchomisz tmux, zawarty proces bash będzie próba uruchomienia własnej sesji tmux, co prowadzi do nieskończonej liczby zagnieżdżonych tmuxenów, które mogą być, err, dość irytujące (to powiedziawszy, wygląda fajnie).


Istnieje jednak bardzo małe ryzyko, że może to sprawić, że bash zachowa się w sposób, którego nie oczekują inne programy, ponieważ uruchamianie Basha może spowodować, że zmieni się on w proces tmux, więc może być lepiej zmodyfikować sposób uruchamiania emulatora terminala.

Używam małego wykonywalnego skryptu powłoki ~/bin/terminal (z ~/bin w $PATH, więc znajduje się automatycznie), który wygląda trochę jak:

#!/bin/sh
exec gnome-terminal -e tmux

(nie używam gnome-terminal, więc być może będziesz musiał usunąć exec, nie jestem pewien.)

Teraz, gdy uruchamiasz terminal scipt, masz terminal z tmux. Możesz dodać to do menu/pulpitu / skrótów klawiaturowych, aby zastąpić domyślny terminal.

(to podejście pozwala również łatwiej dostosować inne rzeczy o emulatorze terminala później, jeśli kiedykolwiek chcesz.)

 57
Author: huon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-03 10:56:30

Jeśli chcesz mieć pojedynczą sesję tmux, umieść następujące elementy w swoim~/.bashrc dla bash lub ~/.zshrc dla zsh :

tmux attach &> /dev/null

if [[ ! $TERM =~ screen ]]; then
    exec tmux
fi

The tmux attach linia ma na celu upewnienie się, czy jest sesja, do której się dołącza i jeśli nie było sesji, nie otrzymasz ostrzeżenia o " no session ".

 13
Author: K.H.A.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-02 09:02:32

Moja oryginalna, zaakceptowana odpowiedź, przestała działać na moim systemie Ubuntu14 po ostatniej aktualizacji.

Używając

[ -z "$TMUX" ] && command -v tmux > /dev/null && TERM=xterm-256color && exec tmux

Lub

[ $TERM != "screen" ] && TERM=xterm-256color && exec tmux
Nie będę mógł się nawet zalogować. Udało mi się to rozwiązać tylko z powodu drugiego logowania administratora na komputerze.

Poprawka dla mnie na Ubuntu (i w osx też) polegała na zmianie mojego programu terminalowego na faktycznie uruchamiany tmux, czyli

Tutaj wpisz opis obrazka

I still have

[ `uname -s` != Linux ] && exec tmux

Jako mój ostatni .bashrc wiersz ale teraz tylko dla moich Systemów Mac OSX.

 12
Author: Michael Durrant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-15 21:10:35

Dla mnie, chciałbym, aby mój tmux był uruchamiany za każdym razem, gdy powłoka na moim zdalnym komputerze, a kiedy odłączam lub wychodzę z tmux, połączenie powinno być zamknięte automatycznie. Po zagłębianiu się w ten problem przez chwilę, poniższy kod robi dokładnie to, czego chcę i uważa się, że jest najbardziej zoptymalizowany zgodnie z moją najlepszą wiedzą.

[ -z "$TMUX"  ] && { tmux attach || exec tmux new-session && exit;}

Uwaga Ta linia powinna być pierwszą linią w pliku bashrc, aby upewnić się, że jest załadowana jako pierwsza. Nie możemy umieścić wywołania "exec" przed "tmux attached" ponieważ po zastąpieniu procesu bash przez exec tmux, połączenie zostanie zamknięte, nawet jeśli nie ma żadnych sesji do dołączenia. Dlatego potrzebujemy wywołania "exit", aby zakończyć połączenie po odłączeniu lub wyjściu z dołączonych sesji. Ale umieszczenie "exec" przed komendą nowej sesji jest w porządku, ponieważ jest to ostatnie polecenie do wykonania.

 5
Author: huangzonghao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-28 04:50:26

Dołącz po linii kodu na końcu .bashrc,

[[ $TERM != "screen" ]] && exec tmux
 3
Author: prayagupd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-08 17:48:29

Zacząłem od tego https://wiki.archlinux.org/index.php/Tmux#Bash i ulepszył go, aby odzyskać odłączone sesje i tworzyć nowe, jeśli wszystkie sesje były już dołączone

# .bashrc

case $- in
    *i*)
    if command -v tmux>/dev/null; then
        if [[ ! $TERM =~ screen ]] && [[ -z $TMUX ]]; then
          if tmux ls 2> /dev/null | grep -q -v attached; then
            exec tmux attach -t $(tmux ls 2> /dev/null | grep -v attached | head -1 | cut -d : -f 1)
          else
            exec tmux
          fi
        fi
    fi
    ;;
esac
 3
Author: Lee Ballard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-20 18:18:58

Aby włączyć tmux dla sesji logowania i ssh, możesz dodać to na końcu swojego .bashrc:

# enable tmux at login
PNAME="$(ps -o comm= $PPID)";
if [ $PNAME == "login" ] || [ $PNAME == "sshd" ] ; then
  exec tmux
fi

Ten skrypt szuka procesu nadrzędnego powłoki bash. Jeśli bash został uruchomiony od logowania lub z ssh, uruchomi tmux. Jeśli chcesz, aby to działało z terminalem GUI, możesz to również dodać. Na przykład, jeśli chcesz uruchomić tmux automatycznie po uruchomieniu standardowego Ubuntu gnome-terminal, Użyj tego:

PNAME="$(ps -o comm= $PPID)";
if [ $PNAME == "login" ] || [ $PNAME == "sshd" ] || [ $PNAME == "gnome-terminal" ] ; then
  exec tmux
fi

Testowałem powyższe na Live Ubuntu Pulpit i mogłem się później zalogować. Nie powinno to naruszać GUI login, chyba że wywoła polecenie login, aby się zalogować. Nie znam linuksowego GUI, który to robi.

 2
Author: ekrekeler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-01 21:13:15

Jednowierszowy, który również upewnia się, że typ terminala jest ustawiony poprawnie dla 256 kolorów:

[ -z "$TMUX" ] && export TERM=xterm-256color && exec tmux
 1
Author: Michael Durrant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-12 11:47:23

A może dodasz

# If not running interactively, do not do anything
[[ $- != *i* ]] && return
[[ -z "$TMUX" ]] && exec tmux

Do twojego .bashrc. Działa również dla zsh.

Wzięte z https://wiki.archlinux.org/index.php/Tmux#Start_tmux_with_default_session_layout

 0
Author: theDrifter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-02 09:14:57

Właśnie zrobiłem skrót klawiaturowy (w Linux Mint Nie Ubuntu; więc nie jestem pewien, czy to takie proste)...


własny skrót dla terminala tmux


To może być trudne do zauważenia, ale Niestandardowy Skrót to gnome-terminal --window --maximize -e tmux. Rozpoczyna się nowe okno gnome-terminal, a następnie exec utes tmux dla Ciebie.

Mam dodatkowo inny Niestandardowy Skrót, który rozpoczyna się "normalnym" gnome-terminal maksymalizowanym(to samo bez -e tmux).

Czuję, że to najlepszy sposób, ponieważ możesz zacząć niezależnie od terminala, w jaki sposób chcesz i jest najbardziej konfigurowalny.

 0
Author: dylnmc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-07 20:53:20

W Xfce4 (uruchamiam Fedorę 24 Xfce spin, jest super), znalazłem najprostsze rozwiązanie to edytowanie skrótów panelowych tak aby działały:

Xfce4-terminal-e tmux

To samo polecenie może być użyte do zastąpienia skrótu klawiatury aplikacji.

Wcześniej wstawiłem do mojej deklaracji if .bashrc, ale powodowało to, że logowanie nie powiodło się (pętla wraca do pola logowania za każdym razem, gdy wprowadzono poprawne hasło).

Komenda dla otwartego terminala Thunara tutaj Komenda różni się nieznacznie. Aby zmienić to goto:

Thunar > Edycja > Konfiguracja Działań Niestandardowych... > Otwórz Terminal tutaj > Edytuj przycisk i zastąp:

Exo-open --working-directory %f --launch TerminalEmulator

With: xfce4-terminal --working-directory %f-e tmux

 0
Author: Duncan Betts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-30 12:40:02