Bir bash betiğinden tmux oturumunda olup olmadığımı nasıl anlarım?


53

Ben benim bash_profilebir git depoda tutmak ve hangi kabuk erişime sahip olduğumu makinelere kopyalamak istiyorum. Ben varım bu yana tmuxçoğu zaman bir var user@hostdurum satırında dize yerine Kabuk isteminde geleneksel nokta.

Kullandığım tüm siteler tmuxyüklü değil, ya da her zaman kullanmıyor olabilirim. Ne zaman bir tmuxoturumda olmadığımı tespit etmek ve istemimi buna göre ayarlamak istiyorum. Şimdiye kadar yarı pişmiş çözüm benim .bash_profilegibi bir şeye benziyor:

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

(Her zaman kontrol etmek muhtemelen en iyi yaklaşım değildir, bu yüzden bunu yapmanın daha iyi bir yolu için önerilere açığım. Bash komut dosyası benim forte değil.)

Yanıtlar:


72

Tmux setleri TMUXtmux oturumlarında ortam değişkeni ve ayarlar TERMiçin screen. Bu% 100 güvenilir bir gösterge değildir (örneğin, screeniçeride tmuxmi tmuxiçeride mi koştuğunuzu kolayca söyleyemezsiniz screen), ancak pratikte yeterince iyi olmalıdır.

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

Bunu ayarlamak için karmaşık bir komut istemine eklemeniz gerekiyorsa PROMPT_COMMAND(bu bir bash ayarıdır, bu nedenle dışa aktarılmamalıdır):

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

Eğer tmux'un kurulu olup olmadığını test etmeniz gerekirse:

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

Bu arada, bunların hepsi girmeli ~/.bashrc, değil ~/.bash_profile(bakınız .bashrc ve .bash_profile arasındaki fark ). ~/.bashrcher bash örneğinde çalıştırılır ve istemler ve diğer adlar gibi kabuk özelleştirmeleri içerir. ~/.bash_profilegiriş yaptığınızda çalıştırılır (giriş kabuğunuz bash ise). İşin garibi, bash ~/.bashrcgiriş kabukları içinde okunmuyor , bu yüzden ~/.bash_profileiçermeli

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

Alternatif bir değişken TMUX_PANEde var. Sadece farkettim çünkü tarifin işe yaramadı. Daha sonra unsetbir kabuk betiğinde bir değişkeni haksız yere kullandığımı (ve sonradan ) benim kaynaklardan aldığımı öğrendim .profile.
0xC0000022L

[ "$TERM" = "screen" ]çalışmayabilir. Benim durumumda, ekranım screen-256renkli rapor ediyordu .
StevieD

@StevieD tmux'un bunu kendi başına yaptığını sanmıyorum ama bir dağıtım ya da yapılandırma olabilir.
Gilles 'SO- kötülük yapmayı bırak'

2

Farklı yollar denedikten sonra, orada herhangi birine yardımcı olması durumunda nihayetinde işe yarayan şey buydu:

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

Bu kod parçasında, TMUX ortamında olup olmadığımızı kontrol ediyorum, başlatıyorum. Bu kod parçacığını .bashrcdosyanızın içine koyarsanız , terminali açtığınızda otomatik olarak TMUX'u çalıştırırsınız! Not: Ubuntu kabuğu üzerinde test edilmiştir.


1

Önceki cevaplara gelince, ${TERM}değişkeni test etmek, köşe olaylarına yol açabilir, tmuxortam değişkenlerini kendi ömrü içinde belirler:

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

Bir tmuxortam içinde olup olmadığınızı kontrol etmek için aşağıdakileri kontrol edin:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.