मैं कैसे बता सकता हूं कि क्या मैं बैश स्क्रिप्ट से tmux सत्र में हूं?


53

मैं अपने git रिपॉजिटरीbash_profile में रखना पसंद करता हूं और इसे उन मशीनों तक क्लोन करता हूं जिनके पास शेल एक्सेस है। चूँकि मैं ज्यादातर समय में है, जब मुझे शेल प्रॉम्प्ट में अपने पारंपरिक स्थान के बजाय स्टेटस लाइन में एक स्ट्रिंग होती है।tmuxuser@host

मेरे द्वारा उपयोग की जाने वाली सभी साइटें tmuxस्थापित नहीं हैं, हालांकि, या मैं हमेशा इसका उपयोग नहीं कर सकता हूं। जब मैं एक tmuxसत्र में नहीं होता हूं, तो उसका पता लगाना चाहता हूं और उसके अनुसार अपना संकेत समायोजित करता हूं। अब तक मेरा आधा पका हुआ घोल .bash_profileकुछ इस तरह दिखता है:

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

(हर बार जाँच करना शायद सबसे अच्छा तरीका नहीं है, इसलिए मैं इसे करने के बेहतर तरीके के लिए सुझावों के लिए तैयार हूँ। बैश स्क्रिप्टिंग मेरे लिए नहीं है।)

जवाबों:


72

Tmux TMUXtmux सेशन में पर्यावरण चर को सेट करता है, और सेट करता TERMहै screen। यह एक 100% विश्वसनीय संकेतक नहीं है (उदाहरण के लिए, आप आसानी से नहीं बता सकते हैं कि आप screenअंदर tmuxया tmuxअंदर चल रहे हैं screen), लेकिन यह अभ्यास में काफी अच्छा होना चाहिए।

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

यदि आपको उस जटिल प्रॉम्प्ट सेट के माध्यम से एकीकृत करने की आवश्यकता है PROMPT_COMMAND(जो एक बैश सेटिंग है, वैसे, तो निर्यात नहीं किया जाना चाहिए)

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

यदि आपको कभी यह जांचने की आवश्यकता है कि क्या tmux स्थापित है:

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

वैसे, यह सभी में जाना चाहिए ~/.bashrc, नहीं ~/.bash_profile(देखें अंतर .ashash और .bash_profile के बीच अंतर )। ~/.bashrcहर बैश इंस्टेंस में चलाया जाता है और इसमें शेल कस्टमाइजेशन जैसे कि प्रॉम्प्ट और एलिस होते हैं। ~/.bash_profileजब आप लॉग इन करते हैं (यदि आपका लॉगिन शेल bash है) तो चलाया जाता है। अजीब तरह से, बैश ~/.bashrcलॉगिन गोले में नहीं पढ़ता है, इसलिए आपके पास ~/.bash_profileहोना चाहिए

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

एक वैकल्पिक चर TMUX_PANEभी है। मैंने केवल इसलिए ध्यान दिया क्योंकि आपका नुस्खा काम नहीं करता था। बाद में मुझे पता चला कि मैंने unsetखोल स्क्रिप्ट में एक चर (और बाद में ) का उपयोग किया था जिसे मैं अपने माध्यम से सोर्स कर रहा हूं .profile
0xC0000022L

[ "$TERM" = "screen" ]काम नहीं हो सकता। मेरे मामले में, मेरी स्क्रीन screen-256रंग के रूप में रिपोर्ट कर रही थी ।
स्टीविएड

@StevieD मुझे नहीं लगता कि tmux अपने दम पर ऐसा करता है, लेकिन यह वितरण पैच या कॉन्फ़िगरेशन हो सकता है।
गाइल्स का SO- बुराई होना बंद करो '

2

विभिन्न तरीकों की कोशिश करने के बाद, यह आखिरकार मेरे लिए काम कर रहा है, अगर यह किसी को वहाँ से बाहर निकलने में मदद करता है:

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

इस कोड स्निपेट में, मैं यह देखने के लिए जाँच करता हूं कि क्या हम TMUX वातावरण में नहीं हैं, मैं इसे लॉन्च करता हूं। यदि आप इस कोड को अपनी .bashrcफाइल में डालते हैं , तो आप कभी भी टर्मिनल खोलते ही स्वतः ही टीएमयूएक्स चला लेंगे! पुनश्च: उबंटू खोल पर परीक्षण किया गया।


1

पिछले उत्तरों के अनुसार, ${TERM}चर का परीक्षण करने से कोने के मामले हो सकते हैं, tmuxपर्यावरण चर को अपने जीवन में सेट करता है:

$ env | grep -i tmux
TMUX = / tmp / tmux-1000 / डिफ़ॉल्ट, 4199,5
TMUX_PANE =% 9
TMUX_PLUGIN_MANAGER_PATH = / घर / आईएमआईएल / .tmux / plugins /

यह जांचने के लिए कि क्या आप tmuxपर्यावरण के अंदर हैं, बस जाँच करें:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.