Come posso impostare la mia shell predefinita per avviare tmux


Risposte:


46

Questo sembra funzionare ...

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

Aggiungi semplicemente la seguente riga di codice bash al tuo .bashrc prima dei tuoi alias; il codice per altre shell è molto simile:

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

2
Per me questo ha richiesto anche [[ $- != *i* ]] && returndi non essere un ciclo infinito (dalla stessa pagina)
Keith Smiley

5
Questa è una cattiva soluzione poiché TERMpotrebbe essere impostata su un altro valore dal .tmux.conffile dell'utente . Meglio verificare se la TMUXvariabile è impostata o meno.
Kusalananda

104

La risposta di @ StarNamer è generalmente accurata, anche se in genere includo i seguenti test per assicurarsi che (1) tmux esista sul sistema, (2) siamo in una shell interattiva e (3) tmux non tenti di funzionare all'interno si:

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

Riferimenti


1
Bello, ne avevo bisogno commandprima ma non mi rendevo conto che esistesse.
Freedom_Ben,

2
questa execaffermazione non ti consente di uscire da tmux senza uscire dall'intero terminale! : |
Louis Maddox,

5
@LouisMaddox: execsostituisce il processo corrente con uno nuovo - in questo caso, sostituisce la shell di login bash con tmux, quindi quando esce tmux non c'è altro terminale su cui ripiegare :)
Mark K Cowan

1
@rjt È corretto, questo inizia una nuova sessione in base alla progettazione. Se preferisci collegarti a una sessione esistente di tmux, sostituiscilo semplicemente exec tmuxcon il tuo gusto preferito ditmux attach
user7089,

2
invece di exec tmuxusare exec tmux new-session -A -s maincosì avrò sempre una sessione chiamata main e mi collegherò ad essa (invece di crearne una nuova ogni volta che mi collegherò al mio computer remoto) ma non andrà in crash come tmux attachse non ci fosse una sessione disponibile (trovata qui: unix.stackexchange.com/a/176885/256942 )
Verena Haunschmid

16

Aggiunta di una riga come

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

nel tuo file bashrc probabilmente farà il lavoro. Nota che questa linea uscirà da ssh e terminerà la connessione una volta staccato o chiuso da tmux. Mi piace questa configurazione in quanto salva i tasti premuti per terminare la connessione. Ma se non ti piace questo (che penso sia molto improbabile) e preferiresti rimanere nella shell di accesso dopo la terminazione, basta rimuovere la exitparte:

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

Si noti inoltre che non dovrebbe avvolgere tmux attachcon exec, in quanto ciò causerebbe la connessione da chiudere quando non ci sono sessioni tmux da allegare al.


Ho aggiunto questa riga al mio .bashrc, ma ora quando avvio un terminale, ricevo alcuni messaggi: /home/z/.tmux.conf:10: nessuna sessione corrente (il messaggio si ripete per le righe 11, 13, 14 , 15). Quelle righe sono cose come "set default-command" exec bash "" e "set default-terminal" screen-256color ".
Matt G

@MattG Senti che c'è qualcosa di sbagliato nel file di configurazione di tmux.
Huangzonghao,

5

C'è un comando chshche cambia la shell di accesso. Consultare man chsh.


6
tmuxnon è una shell, è un multiplexer terminale come lo schermo GNU. È interessante notare che supporta l' -copzione in base alla pagina man , quindi potrebbe funzionare come una shell quanto basta per usarla come shell di accesso, ma sospetto che non funzionerà correttamente in tutte le situazioni, ad esempio accessi grafici tramite gdm / kdm .
Mikel,

1
Sebbene sia ragionevole e supportato dalla documentazione, sembra interrompere l'esecuzione diretta del comando tramite SSH (qualcosa del genere ssh $some_server echo foo).
n.

3
tmux di almeno 1.8 su Ubuntu si aggiunge a /etc/shells, quindi è una shell di login valida.
Claytron,

2
Ciò richiede di configurare l' default-shellimpostazione nella configurazione di tmux in modo che punti a una shell effettiva.
Kusalananda

4

Sto usando con successo

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

nel mio .zshrc. Se stai usando bash, inseriscilo invece nel tuo .bashrc.


Ho anche provato a impostare tmuxcome shell predefinita ( chsh -s $(which tmux)) e sembra interrompere l'esecuzione diretta del comando tramite SSH, ad esempio ssh $some_server echo foonon produrrà alcun output.


3

Vai alle preferenze terminali. inserisci qui la descrizione dell'immagine

E quindi fai clic sulla barra "comando". inserisci qui la descrizione dell'immagine

Seleziona "Esegui un comando personalizzato anziché my sell" e scrivi qualsiasi comando tu voglia eseguire all'avvio del tuo terminale.


1

Nessuna delle risposte di cui sopra ha funzionato per me - mi exec tmuximpedisce di chiudere tmux senza uscire dalla shell (sia che sia aperto con Ctrl+ To dal menu dell'applicazione).

Uso Linux Mint, che consente di mappare determinati tasti di scelta rapida ai comandi e (unos kosher come potrebbe essere ad alcuni ..) Ho shell bash con comandi che si avviano lì, ad es. Win+ Alt+ BFa una sorta di bash -exec(vim)istruzione contorta a modifica il mio .bashrc, quindi si comporta come una normale shell.

tmux caricato piuttosto che vim in quella situazione dopo aver posizionato quanto sopra in cima al mio .bashrc. Ho racchiuso la riga di esecuzione di tmux in un'altra istruzione if, verificando che sia in esecuzione in modalità interattiva.

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

Potresti avvolgere tutto ciò su una riga, ma per leggibilità penso che vada bene.


L'aggiunta di una e commerciale avrebbe risolto il problema in questo modo. [[ ! $TERM =~ screen ]] && [ -z $TMUX ] && exec tmux &
Daniel Chateau,

1

Aggiungendo alla risposta di @Louis Maddox, esegui tmux part con;

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

Lo uso exec sh -c 'tmux a || tmux', che (dopo aver visto la tua risposta) probabilmente farà accadere cose brutte se tmux non può iniziare per qualsiasi motivo ..... grazie, userò la tua da ora in poi :)
Mark K Cowan

1
tmux new -A -s mysessionprobabilmente funzionerà anche.
poolie

1

Questo è nel mio ~/.profile(sto usando ksh93):

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

Se la TMUXvariabile d'ambiente non è impostata / vuota, allora non siamo già in una sessione di tmux, quindi ...

Se tmux has-sessionritorna con uno stato di uscita pari a zero (true), è disponibile una sessione a cui collegarsi. Attaccalo.

In caso contrario, crea una nuova sessione.

È anche possibile utilizzare tmuxcome shell di accesso. Se lo fai, tuttavia, assicurati di impostare default-shelluna shell effettiva nel tuo ~/.tmux.conffile (vedi il manuale di tmux per maggiori informazioni a riguardo).


1

È possibile (e per ora probabilmente dovrebbe) utilizzare il chshcomando per impostare tmux come shell predefinita, quindi aggiungere quanto segue a .tmux.conf:

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

Ricorda solo di modificare il percorso alla fine della riga.


1

Ho combinato i controlli approfonditi, con il controllo della sessione condizionale, e ho messo il mio giro su di esso, per creare una sessione predefinita che è connessa o altrimenti creata. A meno che non ci si trovi all'interno di un'altra sessione o non siano soddisfatte altre condizioni protettive.

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

Sulla base di queste risposte:

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

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


0

Aggiungi questo al tuo ~/.tmux.conf

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

1
Penso che tu abbia frainteso la domanda amico! ;)
PhilT,

-3

Come già affermato da Mikel nel suo commento, avere tmux in quanto la shell di accesso può avere effetti collaterali. Ma puoi tmuxletteralmente creare la tua shell predefinita. La shell predefinita di un utente è definita in / etc / passwd. Quindi puoi diventare root e modificare / etc / passwd, ad esempio sudo vi /etc/passwdcerca la riga che inizia con il tuo nome utente. Probabilmente finisce con :/bin/bash. Cambia / bin / bash in / usr / bin / tmux e ora tmux è la shell di login predefinita.

Tuttavia, nessuna garanzia che ciò non causerà problemi!

Ciò che potrebbe funzionare meglio è NON fare nulla che richieda i privilegi di root. Vorrei provare a creare un file nella mia home directory chiamato .bash_login e avviare tmux dall'interno di quel file: `echo" tmux "> ~ / .bash_login.

Questo dovrebbe funzionare, ma devi provare a trovare il nostro, b / c la documentazione di bash non è molto precisa su quale file viene letto ed eseguito quando.


2
Quello che descrive il tuo primo paragrafo è cosa chshfa! Solo che il tuo modo richiede di essere root ed è soggetto a errori. L'esecuzione tmuxda .bash_loginè più probabile rompere accessi remoti.
Gilles,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.