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
TERM
des Benutzers möglicherweise einen anderen Wert .tmux.conf
angibt. Es ist besser zu überprüfen, ob die TMUX
Variable 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_COMMANDScommand
anstatt which
zu überprüfen, ob Befehle vorhanden sind - https://unix.stackexchange.com/a/85250$PS1
für interaktiv Shell überprüfen - https://www.gnu.org/software/bash/manual/html_node/Is-this-Shell-Interactive_003f.html$TERM
Umgebungsvariablen "für alle Programme, die in tmux ausgeführt werden" - http://man7.org/linux/man-pages/man1/tmux.1.html#WINDOWS_AND_PANEScommand
aber ich habe nicht bemerkt, dass es es gibt.
exec
Anweisung können Sie tmux nicht beenden, ohne das gesamte Terminal zu verlassen! : |
exec
den 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 tmux
Sie diese einfach durch Ihre bevorzugte tmux attach
exec tmux
Ich benutze" exec tmux new-session -A -s main
habe 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 attach
falls 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 exit
Teil:
[ -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 attach
mit denen exec
eine Verbindung hergestellt werden kann.
Es gibt einen Befehl, der chsh
die Anmeldeshell ändert. Konsultieren man chsh
.
tmux
ist keine Shell, sondern ein Terminal-Multiplexer wie GNU-Bildschirm. Interessanterweise unterstützt es die -c
Option 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-shell
Einstellung 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 .bashrc
stattdessen in Ihr ein.
Ich habe auch gerade versucht, tmux
als 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 foo
wird keine Ausgabe erzeugt.
Keine der oben genannten Antworten hat bei mir funktioniert - exec tmux
verhindert, dass ich tmux beende, ohne die Shell zu beenden (unabhängig davon, ob sie mit Ctrl
+ T
oder ü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
+ B
tut 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 mysession
wird 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 TMUX
Umgebungsvariable nicht gesetzt / leer ist, befinden wir uns noch nicht in einer tmux-Sitzung.
Wenn der tmux has-session
Beendigungsstatus 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, tmux
als Login-Shell zu verwenden. Wenn Sie dies jedoch tun, stellen Sie sicher, dass Sie default-shell
eine tatsächliche Shell in Ihrer ~/.tmux.conf
Datei festgelegt haben (weitere Informationen hierzu finden Sie im tmux-Handbuch).
Sie können (und sollten es jetzt wahrscheinlich auch) den chsh
Befehl 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 tmux
Ihre 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/passwd
nach 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.
chsh
tut! Nur dass Ihr Weg root sein muss und fehleranfällig ist. Durch das Ausführen tmux
von .bash_login
wird die Wahrscheinlichkeit erhöht, dass Remoteanmeldungen unterbrochen werden.
[[ $- != *i* ]] && return
keine Endlosschleife sein (von derselben Seite)