विभिन्न टैब के बीच साझा धराशायी इतिहास कैसे प्राप्त करें


19

मैंने अलग-अलग बैश टर्मिनलों के बीच वास्तविक समय के साझा इतिहास को सक्षम करने के लिए /unix//a/1292/41729 में उत्तर का उपयोग किया । जैसा कि ऊपर दिए गए उत्तर में बताया गया है, इसे जोड़कर प्राप्त किया जाता है:

# avoid duplicates..
export HISTCONTROL=ignoredups:erasedups  
# append history entries..
shopt -s histappend

# After each command, save and reload history
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

यदि बैश के गोले अलग-अलग हैं (जैसे कि अलग-अलग बैश टर्मिनल खोलना, तो यह ठीक काम करता है CTRL+ALT+T। हालांकि, यह काम नहीं करता है अगर मैं tabsनई विंडो के बजाय एक खुले टर्मिनल `CTRL + SHIFT + T) का उपयोग करता हूं । व्यवहार में यह अंतर क्यों? कैसे? क्या मैं बैश इतिहास को विभिन्न टैब के बीच भी साझा कर सकता हूं?

अद्यतन: मैंने एक असामान्य व्यवहार पर ध्यान दिया: यदि मैं टाइप करता हूं CTRL+Cतो किसी भी अन्य टर्मिनल (दोनों टैब या नहीं) में टाइप की गई अंतिम कमांड सही ढंग से प्रदर्शित होती है। यह ऐसा है जैसे अगर CTRL + C इतिहास का एक प्रवाह भर देता है तो फिर इसे सही तरीके से साझा किया जाता है।

एक उदाहरण के रूप में आउटपुट (T1 टर्मिनल 1 और T2 टर्मिनल 2 को दर्शाता है):

T1:
ls -lah <enter>
# the list of files and directory is shown

T2:
cd Documents <enter>

T1:
<up> (i.e. I press the up arrow)
ls -lah #i.e the last command in terminal 1 is shown rather than the last of terminal 2
^C (i.e. I press CTRL+C)
<up>
cd Documents #the last command issued in terminal 2 is correctly displayed

आशा है कि यह किसी भी संकेत की पेशकश कर सकता है!


आपने अपनी ~.bashrcफ़ाइल में जोड़ा है ? एक साइड नोट पर, उन चर का निर्यात व्यर्थ है; सिर्फ पर्यावरण की जगह बर्बाद करता है।
जिरह

@geirha हां मैंने अपनी .bashrc फ़ाइल में जोड़ा है। निर्यात पर टिप्पणी के लिए धन्यवाद।
लूसजेरोन

जवाबों:


2

ऐसा लगता है कि आप सिंक से पहले दूसरे टर्मिनल के इतिहास को एक्सेस करने की कोशिश कर रहे हैं । PROMPT_COMMANDएक नया प्रॉम्प्ट छपने से ठीक पहले निष्पादित किया जाता है, अर्थात, जब आप एक कमांड चलाते हैं और इससे पहले कि आप अगला कमांड टाइप करें। तो यह अभी T1 में नहीं होगा; आपको प्रदर्शित होने के लिए एक नया संकेत देना होगा।

इसे जाँचने के लिए, इस चरण को अपने चरणों में आज़माएँ (मैंने <enter>T1 में एक अतिरिक्त जोड़ा ):

T1:
ls -lah <enter>
# the list of files and directory is shown

T2:
cd Documents <enter>

T1:
<enter>
<up> (i.e. I press the up arrow)

प्रवेश के इस अतिरिक्त प्रेस के साथ, आपको एक नया प्रॉम्प्ट मिलता है, जो PROMPT_COMMANDआपके इतिहास को चलाता है और सिंक करता है, और इसलिए मैं इस अप एरो की अपेक्षा करूंगा कि आप चाहते हैं कि cdइसके बजाय ls। दुर्भाग्य से, मुझे नहीं लगता कि बिना किसी आदेश को चलाने के बिना सभी टर्मिनलों में तुरंत सिंक करने का एक तरीका है जैसा आप चाहते हैं; प्रभावी रूप से यह आपके सभी लॉगिन सत्रों को अपनी इतिहास सूचियों को हर समय लगातार सिंक्रनाइज़ करने की आवश्यकता होगी, जो कि सीपीयू और डिस्क विवादास्पद का एक बड़ा अपशिष्ट होगा।


आप सही हैं, एंटर दबाने के बाद इसे सिंक किया गया है। यहां तक ​​कि अगर स्मृति या CPU की बर्बादी होती है, तो मैं सिंक को कैसे मजबूर कर सकता हूं? (यदि यह बहुत अधिक है तो मैं इसे हमेशा अक्षम कर सकता हूं, लेकिन मैं इसे एक कोशिश देना चाहूंगा)
lucacerone

1

मैंने वही सवाल पूछा और यहाँ जवाब है जो मैं आया था ...।

HISTSIZE=9000
HISTFILESIZE=$HISTSIZE
HISTCONTROL=ignorespace:ignoredups

history() {
  _bash_history_sync
  builtin history "$@"
}

_bash_history_sync() {
  builtin history -a         #1
  HISTFILESIZE=$HISTSIZE     #2
  builtin history -c         #3
  builtin history -r         #4
}

PROMPT_COMMAND=_bash_history_sync


मेरे प्रयास करने से पहले दो स्पष्टीकरण: क्या मुझे अन्य हिस्टरी - विकल्पों को हटा देना चाहिए? यह .bashrc सही है?
lucacerone

दुर्भाग्य से यह काम नहीं करता है ...
lucacerone

हर बार HISTFILESIZEबदल दिया जाता है यह स्वचालित रूप से मौजूदा इतिहास फ़ाइल को छोटा करने का प्रयास करता है। HISTSIZEवर्तमान इतिहास पर परिवर्तन का समान प्रभाव है। संदर्भ के लिए, variables.cबैश src में टिप्पणी को कुछ समय पहले देखें sv_histsize
ब्रायन वंडेनबर्ग

1

उस लाइन को अपनी .bashrcफ़ाइल में जोड़ें

# avoid duplicates..
export HISTCONTROL=ignoredups:erasedups  
# append history entries..
shopt -s histappend

trap 'history -r' USR1 
export PROMPT_COMMAND="history -a ; history -c; ps a | awk '/ bash$/ {system (\"kill -USR1 \" \$1)}'; $PROMPT_COMMAND"

ध्यान दें:

शुरू में मैंने अपने टेस्ट बे को किलर के साथ बैश करने के लिए USR1 सिग्नल भेज दिया, बाद में मैंने सोचा कि एक अनूठे शेल नाम का उपयोग किया जाए, टेस्टशेल नाम की एक बैश कॉपी, अपने खुद के गोले को मारने से बचने के लिए जो दौड़ सकता था (उदाहरण के लिए क्रोन प्रक्रियाएं) - स्ट्रैजेल्ली जो नहीं था काम कर रहे।

किलॉल काफी चयनात्मक नहीं था, मैंने इसे एक स्क्रिप्ट के साथ बदल दिया जो केवल बैश प्रक्रियाओं को एक कसकर मारती है ( ps aकेवल एक tty से जुड़ी प्रक्रियाओं की रिपोर्ट करती है)

एक नए PROMPT_COMMAND होने के लिए अपने सत्र को पुनः आरंभ करना न भूलें, जब मैं परीक्षण कर रहा था तो मैंने देखा कि मेरे कई पिछले परीक्षण PROMPT_COMMAND के अंदर ढेर हो गए हैं।


आपको नए उपयोगकर्ता और अन्य शेल की आवश्यकता नहीं है, आप killallकेवल एक अतिरिक्त -uतर्क , e.g. -u $ (whoami) के साथ उसी उपयोगकर्ता की प्रक्रियाओं को संकेत भेजने के लिए कह सकते हैं ।
फिलिप वेंडलर

मुझे लगता है कि csh के लिए वाक्य रचना गलत है ... @PhilippWendler क्या आप थोड़ा विस्तार कर सकते हैं?
ल्यूसजेरोन

सवाल बैश के बारे में है, इसलिए मैंने बैश सिंटैक्स का इस्तेमाल किया। मैं csh नहीं जानता। बैश के लिए, killall -q -USR1 -u $(whoami) bashवर्तमान उपयोगकर्ता की सभी बैश प्रक्रियाओं के लिए USR1 सिग्नल भेजता है।
फिलिप वेंडलर

@Philipp ty btw मैंने समर्पित शेल समाधान का परीक्षण नहीं किया, यह एक मामले को ठीक करना था जहां क्रोन बैश स्क्रिप्ट चलेगी।
इमैनुएल

@LucaCerone मैं काम करने लगता है
इमैनुएल

0

याकुके में मेरे पास एक ही अजीब व्यवहार था जब विस्तृत बैश प्रॉम्प्ट बनाने की कोशिश की गई जो अन्य लॉगिन की संख्या दिखाएगा। टैब के लिए संख्या नहीं बढ़ी। मेरा काम यह था कि मैं bashहर नए टैब में याकूके को फिर से चलाऊं , जो अनिवार्य रूप से बैश में शुरू हो रहा था। यह त्रुटिपूर्ण रूप से काम करने लगा। हो सकता है कि यह आपकी भी मदद करे। मेरा अंधा अनुमान है कि कंसोल लोड बश के लिए GUI स्वयं कॉन्फ़िगर करता है और फिर उन्हें उदाहरणों को काटने के लिए खिलाता है। हो सकता है कि यह उनके साथ फील कर सके।


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