Wie kann ich meine Standard-Shell so einstellen, dass sie tmux startet?

79

Ich möchte, dass meine Standard-Bash-Shell direkt in tmux eingebunden wird, anstatt jedes Mal tmux eingeben zu müssen.

Michael Durrant
quelle

Antworten:

46

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
StarNamer
quelle
2
Für mich musste dies auch [[ $- != *i* ]] && returnkeine Endlosschleife sein (von derselben Seite)
Keith Smiley
5
Dies ist eine schlechte Lösung, da die Datei TERMdes Benutzers möglicherweise einen anderen Wert .tmux.confangibt. Es ist besser zu überprüfen, ob die TMUXVariable gesetzt ist oder nicht.
Kusalananda
104

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

user7089
quelle
1
Schön, ich habe es schon gebraucht, commandaber ich habe nicht bemerkt, dass es es gibt.
Freedom_Ben
2
Mit dieser execAnweisung können Sie tmux nicht beenden, ohne das gesamte Terminal zu verlassen! : |
Louis Maddox
5
@ LouisMaddox: Ersetzt 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 :)
Mark K Cowan
1
@rjt Richtig, hiermit wird eine neue Sitzung gestartet. Wenn Sie es vorziehen, eine bestehende tmux-Sitzung beizufügen, ersetzen exec tmuxSie diese einfach durch Ihre bevorzugte tmux attach
Version
2
Anstelle von " 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 )
Verena Haunschmid
16

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.

Huangzonghao
quelle
Ich habe diese Zeile zu meinem .bashrc hinzugefügt, aber jetzt, wenn ich ein Terminal starte, erhalte ich einige Meldungen: /home/z/.tmux.conf:10: keine aktuelle Sitzung (die Meldung wird für die Zeilen 11, 13, 14 wiederholt , fünfzehn). Diese Zeilen sind Dinge wie "set default-command" exec bash "" und "set default-terminal" screen-256color ".
Matt G
@MattG Es scheint, als ob etwas mit der tmux-Konfigurationsdatei nicht stimmt.
Huangzonghao
5

Es gibt einen Befehl, der chshdie Anmeldeshell ändert. Konsultieren man chsh.

paul
quelle
6
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 .
Mikel
1
Dies ist zwar sinnvoll und wird von der Dokumentation unterstützt, scheint jedoch die direkte Befehlsausführung über SSH (so etwas wie ssh $some_server echo foo) zu unterbrechen .
11.
3
tmux ab mindestens 1.8 unter Ubuntu fügt sich selbst hinzu /etc/shells, so dass es eine gültige Login-Shell ist.
Claytron
2
Dazu müssen Sie die default-shellEinstellung in der tmux-Konfiguration so konfigurieren, dass sie auf eine tatsächliche Shell verweist.
Kusalananda
4

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.

n.st
quelle
3

Gehen Sie zu den Terminalpräferenzen. Bildbeschreibung hier eingeben

Und dann klicken Sie auf "Befehlsleiste". Bildbeschreibung hier eingeben

Aktivieren Sie das Kontrollkästchen "Benutzerdefinierten Befehl anstelle meines Verkaufs ausführen" und schreiben Sie den gewünschten Befehl beim Start Ihres Terminals.

user174935
quelle
1

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.

Louis Maddox
quelle
Das Hinzufügen eines kaufmännischen Und-Zeichens würde dieses Problem so lösen. [[ ! $TERM =~ screen ]] && [ -z $TMUX ] && exec tmux &
Daniel Chateau
1

Wenn ich @ Louis Maddox 'Antwort hinzufüge, würde ich tmux part with ausführen.

(exec tmux attach || exec tmux new-session)
Devrimbaris
quelle
Ich verwende 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
Mark K Cowan
1
tmux new -A -s mysessionwird wohl auch funktionieren.
Poolie
1

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).

Kusalananda
quelle
1

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.

Błażej Michalik
quelle
1

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:

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

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

yosefrow
quelle
0

Fügen Sie dies in Ihre ~/.tmux.conf

set -g default-command /usr/local/bin/fish
IanVaughan
quelle
1
Ich denke, Sie haben den Fragesteller falsch verstanden! ;)
PhilT
-3

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.

Bananguin
quelle
2
Was Ihr erster Absatz beschreibt, ist was 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.
Gilles