Jak ustawić domyślną powłokę, aby uruchamiała tmux


Odpowiedzi:


46

To wydaje się działać ...

https://wiki.archlinux.org/index.php/Tmux#Start_tmux_on_every_shell_login

Po prostu dodaj następujący wiersz kodu bash do .bashrc przed aliasami; kod dla innych powłok jest bardzo podobny:

[[ $TERM != "screen" ]] && exec tmux

2
Dla mnie wymagało to również [[ $- != *i* ]] && returnnie bycia nieskończoną pętlą (z tej samej strony)
Keith Smiley

5
Jest to złe rozwiązanie, ponieważ plik TERMużytkownika może ustawić na inną wartość .tmux.conf. Lepiej sprawdzić, czy TMUXzmienna jest ustawiona, czy nie.
Kusalananda

104

@ Odpowiedź StarNamera jest na ogół dokładna, chociaż zazwyczaj dołączam następujące testy, aby upewnić się, że (1) tmux istnieje w systemie, (2) jesteśmy w interaktywnej powłoce i (3) tmux nie próbuje uruchomić się w obrębie samo:

if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
  exec tmux
fi

Bibliografia


1
Fajnie, potrzebowałem już commandwcześniej, ale nie zdawałem sobie sprawy, że istnieje.
Freedom_Ben

2
ta execinstrukcja nie pozwala ci wyjść z tmux bez wychodzenia z całego terminalu! : |
Louis Maddox,

5
@LouisMaddox: execzastępuje bieżący proces nowym - w tym przypadku zastępuje powłokę logowania bash tmux, więc kiedy tmux kończy działanie, nie ma innego terminala, do którego można by wrócić :)
Mark K Cowan

1
@rjt Zgadza się, to rozpoczyna nową sesję zgodnie z projektem. Jeśli wolisz dołączyć do istniejącej sesji tmux, po prostu zamień exec tmuxna preferowanytmux attach
user7089,

2
zamiast exec tmuxużywam, exec tmux new-session -A -s mainwięc zawsze będę mieć sesję o nazwie main i przyłączę się do niej (zamiast tworzenia nowej za każdym razem, gdy łączę się z moją maszyną zdalną), ale nie zawiedzie się tak, jak tmux attachw przypadku, gdy nie ma dostępnej sesji (tutaj: unix.stackexchange.com/a/176885/256942 )
Verena Haunschmid

16

Dodanie linii podobnej do

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

w twoim pliku bashrc prawdopodobnie wykona zadanie. Zauważ, że ta linia zakończy działanie ssh i zakończy połączenie po odłączeniu lub wyjściu z tmux. Podoba mi się ta konfiguracja, ponieważ oszczędza naciśnięcia klawiszy, aby zakończyć połączenie. Ale jeśli nie podoba ci się to (co moim zdaniem jest bardzo mało prawdopodobne) i wolisz pozostać w powłoce logowania po zakończeniu, po prostu usuń exitczęść:

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

Należy również pamiętać, że nie powinien zawijać tmux attachsię exec, gdyż spowodowałoby to połączenie ma być zamknięty, gdy nie istnieją żadne sesje tmux dołączyć do.


Dodałem tę linię do mojego .bashrc, ale teraz kiedy uruchamiam terminal, otrzymuję kilka komunikatów: /home/z/.tmux.conf:10: brak bieżącej sesji (komunikat powtarza się dla linii 11, 13, 14 , 15). Te wiersze to na przykład „set default-command” exec bash ”i„ set default-terminal ”screen-256color”.
Matt G

@MattG Czujesz, że coś jest nie tak z plikiem konfiguracyjnym tmux.
huangzonghao

5

Istnieje polecenie chshzmieniające powłokę logowania. Skonsultuj się man chsh.


6
tmuxnie jest powłoką, to terminalowy multiplekser, taki jak ekran GNU. Co ciekawe, obsługuje tę -copcję zgodnie ze stroną podręcznika , więc może działać jak powłoka wystarczająca do użycia jej jako powłoki logowania, ale podejrzewam, że nie będzie działać poprawnie we wszystkich sytuacjach, np. Graficznych logowań przez gdm / kdm .
Mikel

1
Chociaż jest to rozsądne i poparte dokumentacją, wydaje się, że przerywa bezpośrednie wykonywanie poleceń przez SSH (coś w tym rodzaju ssh $some_server echo foo).
n

3
tmux od co najmniej 1.8 na Ubuntu dodaje się /etc/shells, więc jest to poprawna powłoka logowania.
claytron

2
Wymaga to skonfigurowania default-shellustawienia w konfiguracji tmux, aby wskazywało na rzeczywistą powłokę.
Kusalananda

4

Z powodzeniem korzystam

case $- in *i*)
    [ -z "$TMUX" ] && exec tmux
esac

w moim .zshrc. Jeśli używasz bash, włóż go .bashrczamiast tego.


Próbowałem też ustawić tmuxjako domyślną powłokę ( chsh -s $(which tmux)) i wydaje się, że przerywa bezpośrednie wykonywanie poleceń przez SSH, np. ssh $some_server echo fooNie generuje żadnych wyników.


2

Przejdź do preferencji terminalu. wprowadź opis zdjęcia tutaj

Następnie kliknij przycisk „paska poleceń”. wprowadź opis zdjęcia tutaj

Zaznacz „Uruchom niestandardowe polecenie zamiast mojej sprzedaży” i napisz dowolne polecenie, które chcesz wykonać podczas uruchamiania terminalu.


1

Żadna z powyższych odpowiedzi nie działała dla mnie - exec tmuxuniemożliwia mi zamknięcie tmux bez wychodzenia z powłoki (niezależnie od tego, czy jest ona otwierana za pomocą Ctrl+, Tczy z menu aplikacji).

Używam Linux Mint, który pozwala mapować niektóre skróty klawiszowe na polecenia, i (un-koszerne może być dla niektórych ..) Mam powłoki bash z poleceniami, które się tam zaczynają, np. Win+ Alt+ BRobi jakąś skomplikowaną bash -exec(vim)instrukcję do edytuj mój .bashrc, aby działał jak zwykła powłoka.

tmux załadował zamiast vim w tej sytuacji po umieszczeniu powyższego na górze mojego .bashrc. Owinąłem linię wykonawczą tmux w inną instrukcję if, sprawdzając, czy działa ona w trybie interaktywnym.

if command -v tmux>/dev/null; then
        if [ ! -z "$PS1" ]; then # unless shell not loaded interactively, run tmux
                [[ ! $TERM =~ screen ]] && [ -z $TMUX ] && tmux
        fi
fi

Możesz to wszystko zawinąć w jedną linię, ale dla czytelności myślę, że to w porządku.


Dodanie znaku handlowego i tak rozwiązałoby ten problem. [[ ! $TERM =~ screen ]] && [ -z $TMUX ] && exec tmux &
Daniel Chateau,

1

Dodając do odpowiedzi @Louis Maddox, wykonałbym część tmux za pomocą;

(exec tmux attach || exec tmux new-session)

Używam exec sh -c 'tmux a || tmux', co (po spojrzeniu na twoją odpowiedź) prawdopodobnie sprawi, że coś złego się stanie, jeśli tmux nie będzie mógł uruchomić się z jakiegokolwiek powodu ..... dziękuję, użyję twojego odtąd :)
Mark K Cowan

1
tmux new -A -s mysessionprawdopodobnie też zadziała.
poolie 22.04.16

1

To jest w moim ~/.profile(używam ksh93):

if [[ -z "$TMUX" ]]; then
    if tmux has-session 2>/dev/null; then
        exec tmux attach
    else
        exec tmux
    fi
fi

Jeśli TMUXzmienna środowiskowa jest nieustawiona / pusta, to nie jesteśmy już w sesji tmux, więc ...

Jeśli tmux has-sessionzwraca z zerowym statusem wyjścia (prawda), dostępna jest sesja do przyłączenia. Dołącz do tego.

Jeśli nie, utwórz nową sesję.

Można również użyć go tmuxjako powłoki logowania. Jeśli to zrobisz, pamiętaj, aby ustawić default-shellrzeczywistą powłokę w swoim ~/.tmux.confpliku (więcej informacji na ten temat znajdziesz w instrukcji tmux).


1

Możesz (i na razie prawdopodobnie powinien) użyć chshpolecenia, aby ustawić tmux jako domyślną powłokę, a następnie dodać następujące polecenie do .tmux.conf:

set-option -g default-shell /path/to/your/favourite/shell

Pamiętaj tylko, aby zmodyfikować ścieżkę na końcu linii.


1

Połączyłem szczegółowe kontrole z warunkowym sprawdzaniem sesji i nadałem mu własny obrót, aby utworzyć domyślną sesję, która jest połączona lub utworzona. Chyba że bierzesz udział w innej sesji Tmux lub inne warunki ochronne są spełnione.

if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
  tmux a -t default || exec tmux new -s default && exit;
fi

Na podstawie tych odpowiedzi:

https://unix.stackexchange.com/a/306165/198110

https://unix.stackexchange.com/a/113768/198110


0

Dodaj to do swojego ~/.tmux.conf

set -g default-command /usr/local/bin/fish

1
Myślę, że źle zrozumiałeś, kolego! ;)
PhilT

-3

Jak już stwierdził Mikel w swoim komentarzu, aby mieć tmux, ponieważ powłoka logowania może mieć skutki uboczne. Ale możesz stworzyć tmuxdomyślną powłokę, dosłownie. Domyślna powłoka użytkownika jest zdefiniowana w / etc / passwd. Możesz więc zostać rootem i edytować / etc / passwd, np. sudo vi /etc/passwdWyszukaj wiersz zaczynający się od twojej nazwy użytkownika. Prawdopodobnie kończy się na :/bin/bash. Zmień / bin / bash na / usr / bin / tmux, a teraz tmux jest domyślną powłoką logowania.

Jednak nie ma gwarancji, że nie spowoduje to problemów!

Co może działać lepiej, to NIE robić niczego, co wymaga uprawnień roota. Spróbowałbym utworzyć plik w moim domowym directoy o nazwie .bash_login i uruchomić tmux z tego pliku: `echo" tmux "> ~ / .bash_login.

To powinno zadziałać, ale musisz spróbować znaleźć naszą własną, b / c dokumentacja bash nie jest bardzo dokładna na temat tego, jaki plik jest odczytywany i wykonywany.


2
To, co opisuje twój pierwszy akapit, to, co chshrobi! Tyle że twoja droga wymaga rootowania i jest podatna na błędy. Bieganie tmuxz .bash_loginjest bardziej podatne na złamania zdalnego logowania.
Gilles,
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.