Bagaimana saya bisa tahu jika saya dalam sesi tmux dari skrip bash?

53

Saya ingin tetap saya bash_profiledalam repositori git dan clone ke mesin apa pun yang saya memiliki akses shell untuk. Karena saya di tmuxsebagian besar waktu saya memiliki user@hoststring di baris status, daripada tempat tradisional di prompt shell.

Tidak semua situs yang saya gunakan telah tmuxdiinstal, atau saya mungkin tidak selalu menggunakannya. Saya ingin mendeteksi ketika saya tidak ada dalam tmuxsesi dan menyesuaikan prompt saya sesuai. Sejauh ini solusi setengah matang saya .bash_profileterlihat seperti ini:

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

(Memeriksa setiap waktu mungkin bukan pendekatan terbaik, jadi saya terbuka untuk saran untuk cara yang lebih baik dalam melakukan ini. Bash scripting bukan keahlian saya.)

Brant
sumber

Jawaban:

72

Tmux mengatur TMUXvariabel lingkungan dalam sesi tmux, dan menetapkan TERMke screen. Ini bukan indikator yang dapat diandalkan 100% (misalnya, Anda tidak dapat dengan mudah mengetahui apakah Anda berlari screendi dalam tmuxatau tmuxdi dalam screen), tetapi dalam praktiknya cukup baik.

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

Jika Anda perlu mengintegrasikannya dalam prompt prompt yang kompleks via PROMPT_COMMAND(yang merupakan pengaturan bash, omong-omong, jadi tidak boleh diekspor):

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

Jika Anda perlu menguji apakah tmux diinstal:

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

By the way, ini semua harus masuk ~/.bashrc, bukan ~/.bash_profile(lihat Perbedaan antara .bashrc dan .bash_profile ). ~/.bashrcdijalankan di setiap instance bash dan berisi kustomisasi shell seperti prompt dan alias. ~/.bash_profiledijalankan ketika Anda masuk (jika shell login Anda adalah bash). Anehnya, bash tidak membaca ~/.bashrcdi shell login, jadi Anda ~/.bash_profileharus memuatnya

case $- in *i*) . ~/.bashrc;; esac
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Ada variabel alternatif TMUX_PANEjuga. Saya hanya memperhatikan karena resep Anda tidak berhasil. Kemudian saya menemukan bahwa saya terlalu banyak menggunakan (dan selanjutnya unset) sebuah variabel dalam skrip shell yang saya sumber melalui .profile.
0xC0000022L
[ "$TERM" = "screen" ]mungkin tidak berfungsi. Dalam kasus saya, layar saya melaporkan sebagai screen-256warna.
StevieD
@StevieD Saya tidak berpikir tmux melakukan ini sendiri, tetapi mungkin patch atau konfigurasi distribusi.
Gilles 'SO- stop being evil'
2

Setelah mencoba berbagai cara, inilah yang akhirnya berhasil untuk saya, kalau-kalau itu membantu siapa pun di luar sana:

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

Dalam cuplikan kode ini, saya memeriksa untuk melihat apakah kita tidak berada di lingkungan TMUX, saya meluncurkannya. Jika Anda memasukkan potongan kode ini ke .bashrcfile Anda, Anda akan secara otomatis menjalankan TMUX kapan saja Anda membuka terminal! PS: diuji pada shell Ubuntu.

Alexar
sumber
1

Adapun jawaban sebelumnya, menguji ${TERM}variabel dapat menyebabkan kasus sudut, tmuxmenetapkan variabel lingkungan dalam hidupnya sendiri:

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

Untuk memeriksa apakah Anda berada di dalam tmuxlingkungan, cukup periksa:

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

iMil
sumber