Vorrei che la mia shell bash predefinita entrasse direttamente in tmux invece di dover sempre digitare tmux ogni volta.
Vorrei che la mia shell bash predefinita entrasse direttamente in tmux invece di dover sempre digitare tmux ogni volta.
Risposte:
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
TERM
potrebbe essere impostata su un altro valore dal .tmux.conf
file dell'utente . Meglio verificare se la TMUX
variabile è impostata o meno.
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
command
per verificare l'esistenza di un comando - http://man7.org/linux/man-pages/man1/bash.1.html#SHELL_BUILTIN_COMMANDScommand
invece di which
verificare l'esistenza di comandi - https://unix.stackexchange.com/a/85250$PS1
per verificare la shell interattiva - https://www.gnu.org/software/bash/manual/html_node/Is-this-Shell-Interactive_003f.html$TERM
variabile d' ambiente "per tutti i programmi in esecuzione all'interno di tmux" - http://man7.org/linux/man-pages/man1/tmux.1.html#WINDOWS_AND_PANEScommand
prima ma non mi rendevo conto che esistesse.
exec
affermazione non ti consente di uscire da tmux senza uscire dall'intero terminale! : |
exec
sostituisce 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 :)
exec tmux
con il tuo gusto preferito ditmux attach
exec tmux
usare exec tmux new-session -A -s main
così 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 attach
se non ci fosse una sessione disponibile (trovata qui: unix.stackexchange.com/a/176885/256942 )
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 exit
parte:
[ -z "$TMUX" ] && { tmux attach || exec tmux new-session;}
Si noti inoltre che non dovrebbe avvolgere tmux attach
con exec
, in quanto ciò causerebbe la connessione da chiudere quando non ci sono sessioni tmux da allegare al.
C'è un comando chsh
che cambia la shell di accesso. Consultare man chsh
.
tmux
non è una shell, è un multiplexer terminale come lo schermo GNU. È interessante notare che supporta l' -c
opzione 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 .
ssh $some_server echo foo
).
/etc/shells
, quindi è una shell di login valida.
default-shell
impostazione nella configurazione di tmux in modo che punti a una shell effettiva.
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 tmux
come shell predefinita ( chsh -s $(which tmux)
) e sembra interrompere l'esecuzione diretta del comando tramite SSH, ad esempio ssh $some_server echo foo
non produrrà alcun output.
Nessuna delle risposte di cui sopra ha funzionato per me - mi exec tmux
impedisce di chiudere tmux senza uscire dalla shell (sia che sia aperto con Ctrl
+ T
o 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
+ B
Fa 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.
[[ ! $TERM =~ screen ]] && [ -z $TMUX ] && exec tmux &
Aggiungendo alla risposta di @Louis Maddox, esegui tmux part con;
(exec tmux attach || exec tmux new-session)
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 :)
tmux new -A -s mysession
probabilmente funzionerà anche.
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 TMUX
variabile d'ambiente non è impostata / vuota, allora non siamo già in una sessione di tmux, quindi ...
Se tmux has-session
ritorna 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 tmux
come shell di accesso. Se lo fai, tuttavia, assicurati di impostare default-shell
una shell effettiva nel tuo ~/.tmux.conf
file (vedi il manuale di tmux per maggiori informazioni a riguardo).
È possibile (e per ora probabilmente dovrebbe) utilizzare il chsh
comando 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.
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:
Aggiungi questo al tuo ~/.tmux.conf
set -g default-command /usr/local/bin/fish
Come già affermato da Mikel nel suo commento, avere tmux in quanto la shell di accesso può avere effetti collaterali. Ma puoi tmux
letteralmente 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/passwd
cerca 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.
chsh
fa! Solo che il tuo modo richiede di essere root ed è soggetto a errori. L'esecuzione tmux
da .bash_login
è più probabile rompere accessi remoti.
[[ $- != *i* ]] && return
di non essere un ciclo infinito (dalla stessa pagina)