Chciałbym, aby moja domyślna powłoka bash przechodziła bezpośrednio do tmux zamiast mojego ciągłego wpisywania tmux za każdym razem.
Chciałbym, aby moja domyślna powłoka bash przechodziła bezpośrednio do tmux zamiast mojego ciągłego wpisywania tmux za każdym razem.
Odpowiedzi:
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
TERM
użytkownika może ustawić na inną wartość .tmux.conf
. Lepiej sprawdzić, czy TMUX
zmienna jest ustawiona, czy nie.
@ 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
command
do sprawdzenia istnienia polecenia - http://man7.org/linux/man-pages/man1/bash.1.html#SHELL_BUILTIN_COMMANDScommand
zamiast which
sprawdzać istnienie poleceń - https://unix.stackexchange.com/a/85250$PS1
do sprawdzania interaktywnej powłoki - https://www.gnu.org/software/bash/manual/html_node/Is-this-Shell-Interactive_003f.html$TERM
zmiennej środowiskowej „dla wszystkich programów działających w tmux” - http://man7.org/linux/man-pages/man1/tmux.1.html#WINDOWS_AND_PANEScommand
wcześniej, ale nie zdawałem sobie sprawy, że istnieje.
exec
instrukcja nie pozwala ci wyjść z tmux bez wychodzenia z całego terminalu! : |
exec
zastę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ć :)
exec tmux
na preferowanytmux attach
exec tmux
używam, exec tmux new-session -A -s main
wię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 attach
w przypadku, gdy nie ma dostępnej sesji (tutaj: unix.stackexchange.com/a/176885/256942 )
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ń exit
część:
[ -z "$TMUX" ] && { tmux attach || exec tmux new-session;}
Należy również pamiętać, że nie powinien zawijać tmux attach
się exec
, gdyż spowodowałoby to połączenie ma być zamknięty, gdy nie istnieją żadne sesje tmux dołączyć do.
Istnieje polecenie chsh
zmieniające powłokę logowania. Skonsultuj się man chsh
.
tmux
nie jest powłoką, to terminalowy multiplekser, taki jak ekran GNU. Co ciekawe, obsługuje tę -c
opcję 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 .
ssh $some_server echo foo
).
/etc/shells
, więc jest to poprawna powłoka logowania.
default-shell
ustawienia w konfiguracji tmux, aby wskazywało na rzeczywistą powłokę.
Z powodzeniem korzystam
case $- in *i*)
[ -z "$TMUX" ] && exec tmux
esac
w moim .zshrc
. Jeśli używasz bash, włóż go .bashrc
zamiast tego.
Próbowałem też ustawić tmux
jako domyślną powłokę ( chsh -s $(which tmux)
) i wydaje się, że przerywa bezpośrednie wykonywanie poleceń przez SSH, np. ssh $some_server echo foo
Nie generuje żadnych wyników.
Żadna z powyższych odpowiedzi nie działała dla mnie - exec tmux
uniemożliwia mi zamknięcie tmux bez wychodzenia z powłoki (niezależnie od tego, czy jest ona otwierana za pomocą Ctrl
+, T
czy 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
+ B
Robi 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.
[[ ! $TERM =~ screen ]] && [ -z $TMUX ] && exec tmux &
Dodając do odpowiedzi @Louis Maddox, wykonałbym część tmux za pomocą;
(exec tmux attach || exec tmux new-session)
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 :)
tmux new -A -s mysession
prawdopodobnie też zadziała.
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 TMUX
zmienna środowiskowa jest nieustawiona / pusta, to nie jesteśmy już w sesji tmux, więc ...
Jeśli tmux has-session
zwraca 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 tmux
jako powłoki logowania. Jeśli to zrobisz, pamiętaj, aby ustawić default-shell
rzeczywistą powłokę w swoim ~/.tmux.conf
pliku (więcej informacji na ten temat znajdziesz w instrukcji tmux).
Możesz (i na razie prawdopodobnie powinien) użyć chsh
polecenia, 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.
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:
Dodaj to do swojego ~/.tmux.conf
set -g default-command /usr/local/bin/fish
Jak już stwierdził Mikel w swoim komentarzu, aby mieć tmux, ponieważ powłoka logowania może mieć skutki uboczne. Ale możesz stworzyć tmux
domyś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/passwd
Wyszukaj 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.
chsh
robi! Tyle że twoja droga wymaga rootowania i jest podatna na błędy. Bieganie tmux
z .bash_login
jest bardziej podatne na złamania zdalnego logowania.
[[ $- != *i* ]] && return
nie bycia nieskończoną pętlą (z tej samej strony)