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
TERMpotrebbe essere impostata su un altro valore dal .tmux.conffile dell'utente . Meglio verificare se la TMUXvariabile è 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
commandper verificare l'esistenza di un comando - http://man7.org/linux/man-pages/man1/bash.1.html#SHELL_BUILTIN_COMMANDScommandinvece di whichverificare l'esistenza di comandi - https://unix.stackexchange.com/a/85250$PS1per verificare la shell interattiva - https://www.gnu.org/software/bash/manual/html_node/Is-this-Shell-Interactive_003f.html$TERMvariabile d' ambiente "per tutti i programmi in esecuzione all'interno di tmux" - http://man7.org/linux/man-pages/man1/tmux.1.html#WINDOWS_AND_PANEScommandprima ma non mi rendevo conto che esistesse.
execaffermazione non ti consente di uscire da tmux senza uscire dall'intero terminale! : |
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 :)
exec tmuxcon il tuo gusto preferito ditmux attach
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 )
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.
C'è un comando chshche cambia la shell di accesso. Consultare man chsh.
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 .
ssh $some_server echo foo).
/etc/shells, quindi è una shell di login valida.
default-shellimpostazione 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 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.
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.
[[ ! $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 mysessionprobabilmente 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 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).
È 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.
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 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.
chshfa! Solo che il tuo modo richiede di essere root ed è soggetto a errori. L'esecuzione tmuxda .bash_loginè più probabile rompere accessi remoti.
[[ $- != *i* ]] && returndi non essere un ciclo infinito (dalla stessa pagina)