मैं चाहूंगा कि मेरा डिफ़ॉल्ट बैश शेल हर बार tmux टाइप करने के बजाय सीधे tmux में जाए।
मैं चाहूंगा कि मेरा डिफ़ॉल्ट बैश शेल हर बार tmux टाइप करने के बजाय सीधे tmux में जाए।
जवाबों:
यह काम करने लगता है ...
https://wiki.archlinux.org/index.php/Tmux#Start_tmux_on_every_shell_login
बस अपने एलियन से पहले अपने .bashrc में bash कोड की निम्न पंक्ति जोड़ें; अन्य गोले के लिए कोड बहुत समान है:
[[ $TERM != "screen" ]] && exec tmux
TERM
उपयोगकर्ता की .tmux.conf
फ़ाइल द्वारा कुछ अन्य मूल्य पर सेट किया जा सकता है । यह जाँचने के लिए बेहतर है कि TMUX
चर सेट है या नहीं।
@ स्टारनामर का उत्तर आम तौर पर सटीक होता है, हालांकि मैं आमतौर पर यह सुनिश्चित करने के लिए निम्न परीक्षण शामिल करता हूं कि (1) tmux सिस्टम पर मौजूद है, (2) हम एक इंटरैक्टिव शेल में हैं, और (3) tmux भीतर चलने की कोशिश नहीं करता है अपने आप:
if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
exec tmux
fi
संदर्भ
command
कमांड के अस्तित्व की जांच करने के लिए बैश का उपयोग करना - http://man7.org/linux/man-pages/man1/bash.1.html#SHELL_BUILTIN_COMMANDScommand
करने के which
लिए क्यों - https://unix.stackexchange.com/a/85250$PS1
इंटरेक्टिव शेल के लिए जाँच करने के लिए उपयोग करना - https://www.gnu.org/software/bash/manual/html_node/Is-this-Shell-Interactive_003f.html$TERM
"चर के अंदर चल रहे सभी कार्यक्रमों के लिए" पर्यावरण चर की अपेक्षित स्थिति - http://man7.org/linux/man-pages/man1/tmux.1.html#WINDOWS_AND_PANEScommand
लेकिन एहसास नहीं हुआ कि यह अस्तित्व में है।
exec
कथन आपको पूरे टर्मिनल को छोड़ने के बिना tmux से बाहर निकलने की अनुमति नहीं देता है! : |
exec
वर्तमान प्रक्रिया को एक नए के साथ बदल देता है - इस मामले में, यह bash लॉगिन शेल को tmux से बदल देता है, इसलिए जब tmux बाहर निकलता है तो वापस गिरने का कोई दूसरा टर्मिनल नहीं है :)
exec tmux
अपने पसंदीदा फ्लेवर की जगह लेंtmux attach
exec tmux
मैं उपयोग करता हूं exec tmux new-session -A -s main
इसलिए मेरे पास हमेशा एक सत्र होगा जिसे मुख्य कहा जाता है और इसे संलग्न करें (हर बार जब मैं अपने रिमोट मशीन से कनेक्ट करता हूं तो एक नया बनाने के बजाय) लेकिन यह दुर्घटनाग्रस्त नहीं होगा जैसे tmux attach
कि कोई सत्र उपलब्ध नहीं है (यहां पाया गया: unix.stackexchange.com/a/176885/256942 )
जैसे कोई लाइन जोड़ना
[ -z "$TMUX" ] && { tmux attach || exec tmux new-session && exit;}
अपने bashrc फ़ाइल में शायद काम करेंगे। ध्यान दें कि यह लाइन ssh से बाहर निकलेगी और एक बार जब आप tmux से बाहर निकलें या बाहर निकलें तो कनेक्शन समाप्त कर दें। मुझे यह कॉन्फ़िगरेशन पसंद है क्योंकि यह कनेक्शन को समाप्त करने के लिए महत्वपूर्ण स्ट्रोक बचाता है। लेकिन अगर आपको यह पसंद नहीं है (जो मुझे लगता है कि बहुत संभावना नहीं है) और समाप्ति के बाद लॉगिन शेल में रहेगा, बस exit
भाग को हटा दें :
[ -z "$TMUX" ] && { tmux attach || exec tmux new-session;}
यह भी ध्यान रखें कि आप के tmux attach
साथ लपेटना नहीं चाहिए exec
, क्योंकि इससे कनेक्शन बंद होने का कारण होगा जब कोई tmux सत्र संलग्न करने के लिए नहीं है।
कमांड है chsh
जो लॉगिन शेल को बदलता है। परामर्श करें man chsh
।
tmux
शेल नहीं है, यह GNU स्क्रीन जैसा टर्मिनल मल्टीप्लेक्स है । दिलचस्प है, यह मैन पेज के-c
अनुसार विकल्प का समर्थन करता है , इसलिए यह आपके लॉगिन शेल के रूप में उपयोग करने के लिए केवल एक शेल की तरह काम कर सकता है, लेकिन मुझे संदेह है कि यह सभी स्थितियों में ठीक से काम नहीं करेगा, उदाहरण के लिए gdm / kdm के माध्यम से ग्राफिकल लॉगिन ।
ssh $some_server echo foo
) के माध्यम से प्रत्यक्ष कमांड निष्पादन को तोड़ने के लिए लगता है ।
/etc/shells
, इसलिए यह एक मान्य लॉगिन शेल है।
default-shell
वास्तविक शेल को इंगित करने के लिए tmux कॉन्फ़िगरेशन में सेटिंग को कॉन्फ़िगर करना होगा।
मैं सफलतापूर्वक उपयोग कर रहा हूं
case $- in *i*)
[ -z "$TMUX" ] && exec tmux
esac
मेरे में .zshrc
। यदि आप बैश का उपयोग कर रहे हैं, तो इसे अपनी .bashrc
जगह पर रखें।
मैंने सिर्फ tmux
अपने डिफ़ॉल्ट शेल ( chsh -s $(which tmux)
) के रूप में सेटिंग की कोशिश की और यह SSH के माध्यम से प्रत्यक्ष कमांड निष्पादन को तोड़ने के लिए लगता है, उदाहरण के ssh $some_server echo foo
लिए कोई आउटपुट नहीं देगा।
उपरोक्त किसी भी प्रतिक्रिया ने मेरे लिए काम नहीं किया - exec tmux
मुझे शेल को छोड़ने के बिना tmux को बंद करने से रोकता है (चाहे वह Ctrl
+ T
या एप्लिकेशन मेनू से खोला गया हो )।
मैं लिनक्स मिंट, जो आप आदेशों के लिए कुछ हॉटकी नक्शा देता है, और का उपयोग करें (अन-कोषेर यह कुछ करने के लिए हो सकता है के रूप में ..) मैं आदेशों वहाँ शुरू करने, जैसे के साथ बैश के गोले मिल गया है Win
+ Alt
+ B
जटिल किसी प्रकार का होता है bash -exec(vim)
करने के लिए बयान मेरे .bashrc को संपादित करें, इसलिए यह एक नियमित शेल की तरह काम करता है।
मेरे ऊपर सबसे ऊपर रखने के बाद उस स्थिति में vim के बजाय tmux लोड किया गया .bashrc
। मैंने tmux को किसी अन्य स्टेटमेंट में लिपटाया है यदि स्टेटमेंट, जाँच रहा है कि यह इंटरेक्टिव मोड में चल रहा है।
if command -v tmux>/dev/null; then
if [ ! -z "$PS1" ]; then # unless shell not loaded interactively, run tmux
[[ ! $TERM =~ screen ]] && [ -z $TMUX ] && tmux
fi
fi
आप एक पंक्ति में वह सब लपेट सकते हैं लेकिन पठनीयता के लिए मुझे लगता है कि यह ठीक है।
[[ ! $TERM =~ screen ]] && [ -z $TMUX ] && exec tmux &
@Louis Maddox के जवाब में जोड़कर, मैं tmux भाग को निष्पादित करूंगा;
(exec tmux attach || exec tmux new-session)
exec sh -c 'tmux a || tmux'
, जो (आपके उत्तर को देखने के बाद) संभवत: खराब चीजें होंगी यदि tmux किसी भी कारण से शुरू नहीं हो सकता है ..... धन्यवाद, मैं अब से तुम्हारा उपयोग करूंगा :)
tmux new -A -s mysession
शायद काम भी करेगा।
यह मेरे ~/.profile
(मैं उपयोग कर रहा हूँ ksh93
) में है:
if [[ -z "$TMUX" ]]; then
if tmux has-session 2>/dev/null; then
exec tmux attach
else
exec tmux
fi
fi
यदि TMUX
पर्यावरण चर अप्रभावित है / खाली है, तो हम पहले से ही tmux सत्र में नहीं हैं, इसलिए ...
यदि tmux has-session
शून्य निकास स्थिति (सत्य) के साथ रिटर्न मिलता है, तो संलग्न करने के लिए एक उपलब्ध सत्र होता है। इसे संलग्न करें।
यदि नहीं, तो एक नया सत्र बनाएँ।
tmux
आपके लॉगिन शेल के रूप में भी इसका उपयोग करना संभव है । यदि आप ऐसा करते हैं, हालांकि, default-shell
अपनी ~/.tmux.conf
फ़ाइल में एक वास्तविक शेल पर सेट करना सुनिश्चित करें (इस बारे में अधिक जानकारी के लिए tmux मैनुअल देखें)।
आप chsh
डिफ़ॉल्ट शेल के रूप में tmux सेट करने के लिए कमांड का उपयोग कर सकते हैं (और अब के रूप में शायद करना चाहिए) , तो निम्न जोड़ें .tmux.conf
:
set-option -g default-shell /path/to/your/favourite/shell
बस लाइन के अंत में पथ को संशोधित करने के लिए याद रखें।
मैंने व्यापक चेकों को सशर्त सत्र की जाँच के साथ जोड़ दिया, और उस पर अपना स्वयं का स्पिन लगाया, जो कि एक डिफ़ॉल्ट सत्र बनाने के लिए जुड़ा हुआ है या जो अन्य बनाया गया है। जब तक आप एक और tmux सत्र के अंदर हैं, या अन्य सुरक्षात्मक शर्तें पूरी नहीं होती हैं।
if command -v tmux &> /dev/null && [ -n "$PS1" ] && [[ ! "$TERM" =~ screen ]] && [[ ! "$TERM" =~ tmux ]] && [ -z "$TMUX" ]; then
tmux a -t default || exec tmux new -s default && exit;
fi
इन उत्तरों के आधार पर:
इसे अपने में जोड़ें ~/.tmux.conf
set -g default-command /usr/local/bin/fish
जैसा कि मिकेल ने पहले ही अपनी टिप्पणी में कहा है कि tmux है क्योंकि आपके लॉगिन शेल के दुष्प्रभाव हो सकते हैं। लेकिन आप tmux
अपने डिफ़ॉल्ट शेल को शाब्दिक रूप से बना सकते हैं । उपयोगकर्ता के डिफ़ॉल्ट शेल को / etc / passwd में परिभाषित किया गया है। तो आप रूट बन सकते हैं और / etc / passwd एडिट कर सकते हैं, उदाहरण के sudo vi /etc/passwd
लिए उस लाइन को खोजें जो आपके उपयोगकर्ता नाम से शुरू होती है। यह शायद के साथ समाप्त होता है :/bin/bash
। / बिन / बैश को / usr / bin / tmux में बदलें और अब tmux आपका डिफ़ॉल्ट लॉगिन शेल है।
हालाँकि, इस बात की कोई गारंटी नहीं है कि इससे समस्याएँ नहीं होंगी!
रूट के विशेषाधिकारों को पुनर्व्यवस्थित करने के लिए कुछ भी नहीं करना बेहतर हो सकता है । मैं अपने होम डायरेक्टॉय में एक फ़ाइल बनाने की कोशिश करूंगा जिसका नाम .bash_login है और उस फ़ाइल के भीतर से tmux शुरू करें: `इको" tmux "> ~ / .bash_login।
यह काम करना चाहिए, लेकिन आपको अपने आप को खोजने और खोजने की कोशिश करनी चाहिए, b / c द बैश डॉक्यूमेंटेशन इस बात के बारे में बहुत सटीक नहीं है कि कौन सी फाइल पढ़ी जाती है और कब निष्पादित की जाती है।
chsh
करता है! सिवाय इसके कि आपके रास्ते को मूल होने की आवश्यकता है और त्रुटि-प्रवण है। रनिंग tmux
से .bash_login
है अधिक दूरदराज के लॉगिन टूटने की संभावना।
[[ $- != *i* ]] && return
एक अनंत लूप (एक ही पृष्ठ से) नहीं होना चाहिए