Ich möchte, dass meine Standard-Bash-Shell direkt in tmux eingebunden wird, anstatt jedes Mal tmux eingeben zu müssen.
Ich möchte, dass meine Standard-Bash-Shell direkt in tmux eingebunden wird, anstatt jedes Mal tmux eingeben zu müssen.
Antworten:
Das scheint zu funktionieren ...
https://wiki.archlinux.org/index.php/Tmux#Start_tmux_on_every_shell_login
Fügen Sie Ihrer .bashrc-Datei einfach die folgende Zeile Bash-Code hinzu, bevor Sie die Aliase eingeben. Der Code für andere Shells ist sehr ähnlich:
[[ $TERM != "screen" ]] && exec tmux
TERMdes Benutzers möglicherweise einen anderen Wert .tmux.confangibt. Es ist besser zu überprüfen, ob die TMUXVariable gesetzt ist oder nicht.
Die Antwort von @ StarNamer ist im Allgemeinen korrekt, obwohl ich normalerweise die folgenden Tests einbeziehe, um sicherzustellen, dass (1) tmux auf dem System vorhanden ist, (2) wir uns in einer interaktiven Shell befinden und (3) tmux nicht versucht, innerhalb dieser Shell zu laufen selbst:
if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
exec tmux
fi
Verweise
commandÜberprüfen Sie mit bash , ob ein Befehl vorhanden ist - http://man7.org/linux/man-pages/man1/bash.1.html#SHELL_BUILTIN_COMMANDScommandanstatt whichzu überprüfen, ob Befehle vorhanden sind - https://unix.stackexchange.com/a/85250$PS1für interaktiv Shell überprüfen - https://www.gnu.org/software/bash/manual/html_node/Is-this-Shell-Interactive_003f.html$TERMUmgebungsvariablen "für alle Programme, die in tmux ausgeführt werden" - http://man7.org/linux/man-pages/man1/tmux.1.html#WINDOWS_AND_PANEScommandaber ich habe nicht bemerkt, dass es es gibt.
execAnweisung können Sie tmux nicht beenden, ohne das gesamte Terminal zu verlassen! : |
execden aktuellen Prozess durch einen neuen. In diesem Fall wird die Bash-Anmeldeshell durch tmux ersetzt. Wenn tmux also beendet wird, kann auf kein anderes Terminal zurückgegriffen werden :)
exec tmuxSie diese einfach durch Ihre bevorzugte tmux attach
exec tmuxIch benutze" exec tmux new-session -A -s mainhabe ich immer eine Sitzung mit dem Namen "main" und binde sie an diese an (anstatt bei jeder Verbindung mit meinem Remotecomputer eine neue zu erstellen), aber sie stürzt nicht ab, wie wenn "Ich benutze", tmux attachfalls keine Sitzung verfügbar ist (hier zu finden: unix.stackexchange.com/a/176885/256942 )
Hinzufügen einer Zeile wie
[ -z "$TMUX" ] && { tmux attach || exec tmux new-session && exit;}
in Ihrer bashrc-Datei erledigt wahrscheinlich die Arbeit. Beachten Sie, dass diese Zeile ssh beendet und die Verbindung beendet, sobald Sie tmux trennen oder beenden. Ich mag diese Konfiguration, da sie Tastatureingaben speichert, um die Verbindung zu beenden. Aber wenn Sie dies nicht lieben (was meiner Meinung nach sehr unwahrscheinlich ist) und nach der Beendigung lieber in der Login-Shell bleiben möchten, entfernen Sie einfach das exitTeil:
[ -z "$TMUX" ] && { tmux attach || exec tmux new-session;}
Beachten Sie auch, dass Sie keinen Zeilenumbruch durchführen sollten , da dies dazu führen würde, dass die Verbindung geschlossen wird, wenn keine tmux-Sitzungen vorhanden sind, tmux attachmit denen execeine Verbindung hergestellt werden kann.
Es gibt einen Befehl, der chshdie Anmeldeshell ändert. Konsultieren man chsh.
tmuxist keine Shell, sondern ein Terminal-Multiplexer wie GNU-Bildschirm. Interessanterweise unterstützt es die -cOption gemäß der Manpage , so dass es wie eine Shell funktioniert, die gerade ausreicht, um es als Anmeldeshell zu verwenden, aber ich vermute, dass es nicht in allen Situationen richtig funktioniert, z. B. bei grafischen Anmeldungen über gdm / kdm .
ssh $some_server echo foo) zu unterbrechen .
/etc/shells, so dass es eine gültige Login-Shell ist.
default-shellEinstellung in der tmux-Konfiguration so konfigurieren, dass sie auf eine tatsächliche Shell verweist.
Ich benutze es erfolgreich
case $- in *i*)
[ -z "$TMUX" ] && exec tmux
esac
in meinem .zshrc. Wenn Sie bash verwenden, geben Sie es .bashrcstattdessen in Ihr ein.
Ich habe auch gerade versucht, tmuxals Standard-Shell ( chsh -s $(which tmux)) festzulegen, und es scheint, als würde die direkte Befehlsausführung über SSH unterbrochen, dh es ssh $some_server echo foowird keine Ausgabe erzeugt.
Keine der oben genannten Antworten hat bei mir funktioniert - exec tmuxverhindert, dass ich tmux beende, ohne die Shell zu beenden (unabhängig davon, ob sie mit Ctrl+ Toder über das Anwendungsmenü geöffnet wurde ).
Ich benutze Linux Mint, die Sie zuordnen bestimmte Hotkeys auf Befehle können, und (un-koscher , wie es sie auch sein mag ..) Ich habe Bash - Shells mit Befehlen dort starten, zB Win+ Alt+ Btut irgendeine Art von gewundenen bash -exec(vim)Erklärung Bearbeiten Sie meine .bashrc-Datei, damit sie wie eine normale Shell funktioniert.
tmux wurde in dieser Situation eher geladen als vim, nachdem das Obengenannte oben auf meiner Seite platziert wurde .bashrc. Ich habe die tmux-Ausführungszeile in eine andere if-Anweisung eingeschlossen und überprüft, ob sie im interaktiven Modus ausgeführt wird.
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
Sie könnten das alles in eine Zeile schreiben, aber für die Lesbarkeit denke ich, dass das in Ordnung ist.
[[ ! $TERM =~ screen ]] && [ -z $TMUX ] && exec tmux &
Wenn ich @ Louis Maddox 'Antwort hinzufüge, würde ich tmux part with ausführen.
(exec tmux attach || exec tmux new-session)
exec sh -c 'tmux a || tmux', was (nach dem in Ihrer Antwort sucht) wird wahrscheinlich schlechte Dinge passieren , wenn tmux aus irgendeinem Grunde nicht starten kann ..... danke, ich werde Sie von jetzt an :) verwenden
tmux new -A -s mysessionwird wohl auch funktionieren.
Dies ist in meinem ~/.profile(ich benutze ksh93):
if [[ -z "$TMUX" ]]; then
if tmux has-session 2>/dev/null; then
exec tmux attach
else
exec tmux
fi
fi
Wenn die TMUXUmgebungsvariable nicht gesetzt / leer ist, befinden wir uns noch nicht in einer tmux-Sitzung.
Wenn der tmux has-sessionBeendigungsstatus Null (true) zurückgegeben wird, ist eine Sitzung zum Anhängen verfügbar. Anhängen.
Wenn nicht, erstellen Sie eine neue Sitzung.
Es ist auch möglich, tmuxals Login-Shell zu verwenden. Wenn Sie dies jedoch tun, stellen Sie sicher, dass Sie default-shelleine tatsächliche Shell in Ihrer ~/.tmux.confDatei festgelegt haben (weitere Informationen hierzu finden Sie im tmux-Handbuch).
Sie können (und sollten es jetzt wahrscheinlich auch) den chshBefehl verwenden, um tmux als Standard-Shell festzulegen. Fügen Sie dann Folgendes hinzu .tmux.conf:
set-option -g default-shell /path/to/your/favourite/shell
Denken Sie daran, den Pfad am Ende der Zeile zu ändern.
Ich habe die umfangreichen Überprüfungen mit der Prüfung bedingter Sitzungen kombiniert und meine eigenen Einstellungen vorgenommen, um eine Standardsitzung zu erstellen, mit der eine Verbindung besteht oder die ansonsten erstellt wird. Es sei denn, Sie befinden sich in einer anderen tmux-Sitzung oder andere Schutzbedingungen sind erfüllt.
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
Basierend auf diesen Antworten:
Fügen Sie dies in Ihre ~/.tmux.conf
set -g default-command /usr/local/bin/fish
Wie Mikel bereits in seinem Kommentar ausgeführt hat, kann tmux als Login-Shell Nebenwirkungen haben. Aber Sie können tmuxIhre Standard-Shell buchstäblich machen. Die Standard-Shell eines Benutzers ist in / etc / passwd definiert. So können Sie root werden und / etc / passwd bearbeiten, z. B. sudo vi /etc/passwdnach der Zeile suchen, die mit Ihrem Benutzernamen beginnt. Es endet wahrscheinlich mit :/bin/bash. Ändern Sie / bin / bash in / usr / bin / tmux, und jetzt ist tmux Ihre Standardanmeldeshell.
Es kann jedoch nicht garantiert werden, dass dies keine Probleme verursacht!
Was kann besser arbeiten ist nicht alles zu tun , die Root - Privilegien requries. Ich würde versuchen, eine Datei in meinem Home-Verzeichnis mit dem Namen .bash_login zu erstellen und tmux aus dieser Datei heraus zu starten: `echo" tmux "> ~ / .bash_login.
Dies sollte funktionieren, aber Sie müssen versuchen, unsere selbst zu finden, da die Bash-Dokumentation nicht sehr genau darüber ist, welche Datei wann gelesen und ausgeführt wird.
chshtut! Nur dass Ihr Weg root sein muss und fehleranfällig ist. Durch das Ausführen tmuxvon .bash_loginwird die Wahrscheinlichkeit erhöht, dass Remoteanmeldungen unterbrochen werden.
[[ $- != *i* ]] && returnkeine Endlosschleife sein (von derselben Seite)