Come posso sapere se sono in una sessione tmux da uno script bash?


54

Mi piace tenere il mio bash_profilein un repository git e clonarlo su qualsiasi macchina a cui ho accesso alla shell. Dato che sono nella tmuxmaggior parte delle volte ho una user@hoststringa nella riga di stato, piuttosto che il suo punto tradizionale nel prompt della shell.

tmuxTuttavia, non tutti i siti che utilizzo sono stati installati o non sempre lo sto usando. Vorrei rilevare quando non sono in una tmuxsessione e adattare di conseguenza il mio prompt. Finora la mia soluzione cotta in forno .bash_profileè simile a questa:

_display_host_unless_in_tmux_session() {
    # ???
}
export PROMPT_COMMAND='PS1=$(_display_host_unless_in_tmux_session)${REST_OF_PROMPT}'

(Controllare ogni volta probabilmente non è l'approccio migliore, quindi sono aperto a suggerimenti per un modo migliore di farlo. Gli script Bash non sono il mio punto di forza.)

Risposte:


73

Tmux imposta la TMUXvariabile d'ambiente in sessioni tmux e imposta TERMsu screen. Questo non è un indicatore affidabile al 100% (ad esempio, non puoi facilmente capire se stai correndo screendentro tmuxo tmuxdentro screen), ma dovrebbe essere abbastanza buono in pratica.

if ! { [ "$TERM" = "screen" ] && [ -n "$TMUX" ]; } then
  PS1="@$HOSTNAME $PS1"
fi

Se è necessario integrarlo in un set di prompt complesso tramite PROMPT_COMMAND(che è un'impostazione bash, a proposito, quindi non dovrebbe essere esportato):

if [ "$TERM" = "screen" ] && [ -n "$TMUX" ]; then
  PS1_HOSTNAME=
else
  PS1_HOSTNAME="@$HOSTNAME"
fi
PROMPT_COMMAND='PS1="$PS1_HOSTNAME…"'

Se hai mai bisogno di verificare se tmux è installato:

if type tmux >/dev/null 2>/dev/null; then
  # you can start tmux if you want
fi

A proposito, tutto ciò dovrebbe andare ~/.bashrc, non ~/.bash_profile(vedi Differenza tra .bashrc e .bash_profile ). ~/.bashrcviene eseguito in ogni istanza bash e contiene personalizzazioni della shell come prompt e alias. ~/.bash_profileviene eseguito quando si accede (se la shell di accesso è bash). Stranamente, bash non legge ~/.bashrcnelle shell di login, quindi ~/.bash_profiledovresti contenere

case $- in *i*) . ~/.bashrc;; esac

Esiste anche una variabile alternativa TMUX_PANE. Ho notato solo perché la tua ricetta non ha funzionato. Più tardi ho scoperto che avevo usato indebitamente (e successivamente unset) una variabile in uno script di shell che sto cercando attraverso il mio .profile.
0xC0000022L

[ "$TERM" = "screen" ]potrebbe non funzionare. Nel mio caso, il mio schermo riportava il screen-256colore.
StevieD

@StevieD Non penso che tmux lo faccia da solo, ma potrebbe essere una patch o una configurazione di distribuzione.
Gilles 'SO- smetti di essere malvagio' il

2

Dopo aver provato diversi modi, questo è ciò che alla fine ha funzionato per me, nel caso in cui aiuti qualcuno là fuori:

if [[ "$TERM" =~ "screen".* ]]; then
  echo "We are in TMUX!"
else
  echo "We are not in TMUX :/  Let's get in!"
  # Launches tmux in a session called 'base'.
  tmux attach -t base || tmux new -s base
fi

In questo frammento di codice, controllo per vedere se non siamo in ambiente TMUX, lo lancio. Se inserisci questo frammento di codice nel tuo .bashrcfile, eseguirai automaticamente TMUX ogni volta che apri il terminale! PS: testato su shell Ubuntu.


1

Per quanto riguarda le risposte precedenti, testare la ${TERM}variabile potrebbe portare a casi angolari, tmuximpostare le variabili di ambiente all'interno della propria vita:

$ env | grep -i tmux
Tmux = / tmp / tmux-1000 / default, 4199,5
TMUX_PANE =% 9
TMUX_PLUGIN_MANAGER_PATH = / home / Imil / .tmux / plugins /

Per verificare se ti trovi all'interno di un tmuxambiente, controlla semplicemente:

$ [ -z "${TMUX}" ] && echo "not in tmux"

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.