GNU/Linux >> Linux Esercitazione >  >> Linux

Come sapere se sono in una sessione Tmux da uno script Bash?

Mi piace mantenere il mio bash_profile in un repository git e clonarlo su qualsiasi macchina a cui ho accesso shell. Dato che sono in tmux la maggior parte delle volte ho un [email protected] stringa nella riga di stato, piuttosto che il suo punto tradizionale nel prompt della shell.

Non tutti i siti che utilizzo hanno tmux installato, tuttavia, o potrei non usarlo sempre. Vorrei rilevare quando non sono in un tmux sessione e regolare la mia richiesta di conseguenza. Finora la mia soluzione semicotta in .bash_profile assomiglia a questo:

_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 per farlo. Lo scripting Bash non è il mio forte.)

Risposta accettata:

Tmux imposta il TMUX variabile di ambiente nelle sessioni tmux e imposta TERM allo screen . Questo non è un indicatore affidabile al 100% (ad esempio, non puoi facilmente dire se stai eseguendo screen dentro tmux o tmux all'interno dello screen ), ma in pratica dovrebbe essere abbastanza buono.

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

Se è necessario integrarlo in un insieme di prompt complesso tramite PROMPT_COMMAND (che è un'impostazione bash, tra l'altro, quindi non dovrebbe essere esportata):

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

Se hai 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 questo dovrebbe andare in ~/.bashrc , non ~/.bash_profile (vedi Differenza tra .bashrc e .bash_profile). ~/.bashrc viene eseguito in ogni istanza bash e contiene personalizzazioni della shell come prompt e alias. ~/.bash_profile viene eseguito quando accedi (se la tua shell di accesso è bash). Stranamente, bash non legge ~/.bashrc nelle shell di accesso, quindi il tuo ~/.bash_profile dovrebbe contenere

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

Linux
  1. Come eseguire il debug di uno script Bash?

  2. Come dire a quale versione di Os X mi trovo dalla riga di comando?

  3. Bash + Come uscire dallo script secondario e dallo script principale in entrambi i casi?

  4. Come dividere una stringa nello script Bash

  5. Come passare i parametri a uno script Bash?

Come eseguire uno script Bash {7 metodi}

Come scrivere uno script Bash con esempi

Bash break:come uscire da un loop

Come eseguire uno script Bash

Script bash:utilizzo del comando script da uno script bash per la registrazione di una sessione

Come eseguire uno script bash?