कई टर्मिनल विंडो में बैश इतिहास को संरक्षित करें


526

मेरे पास लगातार एक से अधिक टर्मिनल खुले हैं। कहीं भी दो से दस, विभिन्न बिट्स और बोब्स कर रहे हैं। अब कहते हैं कि मैं पुनः आरंभ करता हूं और टर्मिनलों के एक और सेट को खोलता हूं। कुछ को कुछ बातें याद रहती हैं, कुछ भूल जाते हैं।

मैं एक इतिहास चाहता हूँ कि:

  • हर टर्मिनल से सबकुछ याद आता है
  • हर टर्मिनल से तुरंत पहुँचा जा सकता है (जैसे अगर मैं lsएक में हूँ, तो पहले से चल रहे दूसरे टर्मिनल पर जाएँ और फिर दबाएं, lsदिखाता है)
  • यदि कमांड के सामने स्थान हो तो कमांड को न भूलें।

कुछ भी मैं इस तरह से काम को अधिक करने के लिए कर सकता हूं?


57
मैं इसका लाभ देख सकता हूं, लेकिन व्यक्तिगत रूप से मुझे अपने शेल में घृणा होगी। मैं आमतौर पर अपने टर्मिनल में बहुत विशिष्ट उपयोगों के लिए 3 या 4 टैब खुला रखता हूं: एक 'मेक' चलाने के लिए, एक vi के साथ, एक सामान चलाने के लिए, आदि। इसलिए जब मैं संकलन करता हूं, तो मैं टैब 1 पर जाता हूं, हिट करता हूं और 'मेक' करता हूं। 'ऊपर आता है, और इसी तरह। यह मेरे लिए बेहद उत्पादक है। इसलिए अगर अचानक मैं अपने 'मेक' टैब पर जाता हूं और हिट हो जाता है और कुछ रैंडम grep कमांड दिखाई देता है, तो मुझे वास्तव में नाराज होना पड़ेगा! बस एक व्यक्तिगत नोट हालांकि
axel_c

4
@axel_c यह काफी हद तक सही है। मैं ऐसा करने के लिए एक बुद्धिमान तरीके के बारे में नहीं सोच सकता जहाँ मौजूदा टर्मिनल केवल अपना इतिहास देखते हैं लेकिन नए लोग आदेशों की कालानुक्रमिक सटीक सूची देखते हैं।
ओली

8
@ ओली ने लिखा, "मैं ऐसा करने के लिए एक बुद्धिमान तरीके के बारे में नहीं सोच सकता, जहां मौजूदा टर्मिनल केवल अपना इतिहास देखते हैं, लेकिन नए लोग आदेशों की कालानुक्रमिक सटीक सूची देखते हैं।" कैसे (के बारे में) export PROMPT_COMMAND="history -a; $PROMPT_COMMAND":। मौजूदा गोले प्रत्येक कमांड को देखने के लिए नए गोले के लिए इतिहास फ़ाइल में जोड़ देंगे, लेकिन केवल अपने स्वयं के इतिहास दिखाते हैं।
क्रिस पेज

2
क्या आप चाहते हैं कि इतिहास अलग से संग्रहीत हो या सभी एक ही इतिहास फ़ाइल में विलय हो जाएं?
kbyrd

3
संक्षिप्त उत्तर है: यह बैश डेवलपर्स द्वारा लक्षित नहीं है। फिर निस्तब्धता पर आधारित समाधान, इतिहास को फिर से पढ़ना शायद काम करते हैं, लेकिन शमील द पेंटर से सावधान रहें । सीधे शब्दों में: प्रत्येक कमांड के बीच प्रसंस्करण कार्य की मात्रा इतिहास के आकार के लिए आनुपातिक है।
स्टीफन गौरीचोन

जवाबों:


329

निम्नलिखित को ~ / .bashrc में जोड़ें

# Avoid duplicates
export HISTCONTROL=ignoredups:erasedups  
# When the shell exits, append to the history file instead of overwriting it
shopt -s histappend

# After each command, append to the history file and reread it
export PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"

20
इस PROMPT_COMMAND समाधान के साथ समस्या यह है कि प्रत्येक कमांड के बाद प्रत्येक इतिहास आइटम के नंबर बदल जाते हैं :(! उदाहरण के लिए यदि आप इतिहास टाइप करते हैं और 1) ls 2) rm, तो आप करते हैं! 1 को दोहराने के लिए 1, इतिहास नंबर बदल सकता है। आरएम कमांड चला सकते हैं ...
क्रिस किम्प्टन

2
जब मैं ऐसा करता हूं, तो पहले से ही खुले अन्य टर्मिनलों में अंतिम दर्ज कमांड नहीं होती है जब तक मैं उस टर्मिनल में कमांड जारी करने के बाद 'अप' दबाता हूं - क्या यह अपेक्षित है? यदि हां, तो क्या वास्तव में अन्य टर्मिनलों के इतिहास को तुरंत संशोधित करने का एक तरीका है?
सुअन

7
@ यह आदेशों के आधार पर मुझे सही लगता है। मैंने पाया कि हम इतिहास को अपडेट करने के लिए एक अशक्त कमांड (बस एंटर कुंजी दबाएं) जारी कर सकते हैं।
ऋषि

3
वास्तव में history -a(...) प्रश्न बैश इतिहास के इस उत्तर के अनुसार डुप्लिकेट को मिटाते हुए ट्रिगर नहीं करता है : "अनदेखा" और "मिटा" सत्रों में सामान्य इतिहास के साथ संघर्ष स्थापित करना । यह उत्तर सेटिंग के history -<option>साथ काम HISTCONTROL=ignoredups:erasedupsकरने वाले आदेशों का अनुक्रम भी देता है ।
पयोट्र डोब्रोगॉस्ट

23
वहाँ के लिए कोई कारण नहीं है और चर: आप उन्हें में परिभाषित कर रहे हैं ताकि वे हर खोल (गैर-सहभागी लोगों में भी है, जो भी बेकार है) में परिभाषित किया जाएगा। exportHISTCONTROLPROMPT_COMMAND.bashrc
डोलमेन

248

तो, यह मेरे इतिहास से जुड़ी सभी .bashrcबातें हैं:

export HISTCONTROL=ignoredups:erasedups  # no duplicate entries
export HISTSIZE=100000                   # big big history
export HISTFILESIZE=100000               # big big history
shopt -s histappend                      # append to history, don't overwrite it

# Save and reload the history after each command finishes
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

मैक ओएस एक्स 10.5 पर बैश 3.2.17 के साथ टेस्ट किया गया, 10.6 पर 4.1.7 का बैश किया गया।


3
हम्म .. यह $ 34 का उपयोग करने की क्षमता को मारता है, क्योंकि कमांड संख्या हर संकेत को बदल देती है। क्या वर्कअराउंड @Davide @Schof @kch है?

5
अनंत इतिहास पाने के लिए इसका उपयोग करें: शाश्वत इतिहास को कोसें । फिर भी, यह ऊपर दिए गए कोड के लिए अनुकूल है, क्योंकि यह स्वचालित रूप से पुनः लोड नहीं किया जाएगा।

7
FYI करें यहां वर्णित कोई भी समाधान निम्न समस्या को हल नहीं कर सकता है। मेरे पास शेल विंडो ए में दो शेल विंडो ए और बी हैं, मैं दौड़ता हूं sleep 9999, और शेल विंडो बी में नींद पूरी होने का इंतजार किए बिना), मैं sleep 9999बैश इतिहास में देखने में सक्षम होना चाहता हूं ।
अंक

1
@ लिप्स मैं भी लाइव व्यवहार के लिए लक्ष्य कर रहा था, लेकिन फिर मुझे एहसास हुआ कि टर्मिनल विशिष्ट इतिहासों के लिए अधिक सुविधाजनक है जो विभिन्न टर्मिनलों में विभिन्न चीजों पर काम करना आसान बनाते हैं। मुझे यह बहुत उपयोगी लगा: stackoverflow.com/questions/338285/#answer-7449399 उसके आधार पर, मैंने खुद को एक उपनाम बनाया, hrefजो मेरे वर्तमान टर्मिनल के इतिहास को तुरंत ताज़ा करता है और प्रक्रिया में इतिहास फ़ाइल को साफ करता है। जब भी मैं एक नया टर्मिनल खोलता हूं, तो मेरी bashrc फाइल में क्लीनअप / सिंक निष्पादित हो जाता है, इसलिए नए टर्मिनल का नवीनतम इतिहास होता है। मैं उस के साथhistory -a
trusktr

6
exportचर का कोई कारण नहीं है : आप उन्हें परिभाषित कर रहे हैं, .bashrcइसलिए उन्हें हर शेल में परिभाषित किया जाएगा (यहां तक ​​कि गैर-इंटरैक्टिव वाले में, जो भी बेकार है)
डॉल्मेन

118

यहाँ बैश सत्र इतिहास साझा करने का मेरा प्रयास है। यह बैश सत्रों के बीच इतिहास के बंटवारे को इस तरह से सक्षम करेगा कि इतिहास काउंटर को मिलाया नहीं जा सके और इतिहास विस्तार जैसे !number(कुछ बाधाओं के साथ) काम करेगा।

Ubuntu 10.04 LTS (ल्यूसिड लिंक्स) के तहत बैश संस्करण 4.1.5 का उपयोग करना।

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

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

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

PROMPT_COMMAND=_bash_history_sync

स्पष्टीकरण:

  1. बस दर्ज की गई लाइन को $HISTFILEडिफॉल्ट में जोड़ें (डिफ़ॉल्ट है .bash_history)। यह $HISTFILEएक लाइन से बढ़ने का कारण होगा ।

  2. विशेष चर $HISTFILESIZEको कुछ मान पर सेट करने से बैश सबसे पुरानी प्रविष्टियों को हटाकर लाइनों $HISTFILEसे अलग नहीं रह जाएगा $HISTFILESIZE

  3. चल रहे सत्र का इतिहास साफ़ करें। इससे इतिहास काउंटर कम हो जाएगा $HISTSIZE

  4. की सामग्री को पढ़ें $HISTFILEऔर उन्हें वर्तमान चालू सत्र इतिहास में डालें। यह पंक्तियों की मात्रा द्वारा इतिहास काउंटर को बढ़ाएगा $HISTFILE। ध्यान दें कि लाइन की गिनती $HISTFILEजरूरी नहीं है $HISTFILESIZE

  5. history()समारोह में निर्मित इतिहास यह सुनिश्चित करें कि इतिहास से पहले यह प्रदर्शित किया जाता है सिंक्रनाइज़ है बनाने के लिए ओवरराइड करता है। यह संख्या द्वारा इतिहास विस्तार के लिए आवश्यक है (बाद में इसके बारे में अधिक)।

अधिक स्पष्टीकरण:

  • चरण 1 यह सुनिश्चित करता है कि वर्तमान चल रहे सत्र से कमांड वैश्विक इतिहास फ़ाइल को लिखा जाए।

  • चरण 4 यह सुनिश्चित करता है कि अन्य सत्रों के आदेश वर्तमान सत्र इतिहास में पढ़े जाएं।

  • क्योंकि चरण 4 इतिहास काउंटर को बढ़ाएगा, हमें किसी तरह काउंटर को कम करने की आवश्यकता है। यह चरण 3 में किया जाता है।

  • चरण 3 में इतिहास काउंटर द्वारा कम किया गया है $HISTSIZE। चरण 4 में इतिहास काउंटर को लाइनों की संख्या से उठाया गया है $HISTFILE। चरण 2 में हम यह सुनिश्चित करते हैं कि लाइन की गिनती $HISTFILEवास्तव में है $HISTSIZE(इसका मतलब यह है कि $HISTFILESIZEजैसा होना चाहिए $HISTSIZE)।

इतिहास विस्तार की बाधाओं के बारे में:

संख्या से इतिहास विस्तार का उपयोग करते समय, आप चाहिए हमेशा ऊपर नंबर देखने के लिए तुरंत उपयोग करने से पहले। इसका मतलब है कि नंबर को देखने और इसका उपयोग करने के बीच कोई भी बैश प्रॉम्प्ट डिस्प्ले नहीं है। आमतौर पर इसका मतलब है कि कोई भी एंट्री और कोई ctrl + c नहीं।

आम तौर पर, एक बार आपके एक से अधिक बैश सत्र होने के बाद, इस बात की कोई गारंटी नहीं है कि संख्या द्वारा एक इतिहास विस्तार दो बैश प्रॉम्प्ट डिस्प्ले के बीच अपने मूल्य को बनाए रखेगा। क्योंकि जब PROMPT_COMMANDअन्य सभी बैश सत्रों से इतिहास को निष्पादित किया जाता है, तो वर्तमान सत्र के इतिहास में एकीकृत किया जाता है। यदि किसी अन्य बैश सत्र में एक नया कमांड है तो वर्तमान सत्र के इतिहास की संख्या अलग होगी।

मुझे यह अड़चन उचित लगती है। मुझे वैसे भी हर बार संख्या को देखना होगा क्योंकि मैं मनमाने ढंग से इतिहास संख्या को याद नहीं कर सकता।

आमतौर पर मैं इस तरह से संख्या के हिसाब से इतिहास विस्तार का उपयोग करता हूं

$ history | grep something #note number
$ !number

मैं निम्नलिखित बैश विकल्पों का उपयोग करने की सलाह देता हूं।

## reedit a history substitution line if it failed
shopt -s histreedit
## edit a recalled history line before executing
shopt -s histverify

अजीब कीड़े:

कुछ भी करने के लिए इतिहास कमांड चलाने से उस कमांड को दो बार इतिहास में सूचीबद्ध किया जाएगा। उदाहरण के लिए:

$ history | head
$ history | tail
$ history | grep foo
$ history | true
$ history | false

सभी को इतिहास में दो बार सूचीबद्ध किया जाएगा। मुझे कोई जानकारी नहीं है की क्यों।

सुधार के लिए विचार:

  • फ़ंक्शन को संशोधित करें _bash_history_sync()ताकि यह हर बार निष्पादित न हो। उदाहरण के लिए इसे CTRL+Cप्रॉम्प्ट पर लागू नहीं किया जाना चाहिए । मैं अक्सर CTRL+Cएक लंबी कमांड लाइन को छोड़ने के लिए उपयोग करता हूं जब मैं यह तय करता हूं कि मैं उस लाइन को निष्पादित नहीं करना चाहता हूं। कभी-कभी मुझे CTRL+Cबैश पूर्ण स्क्रिप्ट को रोकने के लिए उपयोग करना पड़ता है ।

  • वर्तमान सत्र से कमांड हमेशा वर्तमान सत्र के इतिहास में सबसे हाल ही में होनी चाहिए। इसका साइड इफेक्ट यह भी होगा कि एक दिया गया इतिहास नंबर इस सत्र से इतिहास प्रविष्टियों के लिए अपना मूल्य रखता है।


1
"इतिहास -c; इतिहास -r" के बजाय "इतिहास-एन" (पहले से लोड नहीं की गई लोडिंग) क्यों नहीं?
ग्राहम

@ ग्राहम: मैं उपयोग नहीं करना चाहता था history -nक्योंकि यह इतिहास के काउंटर को गड़बड़ कर देता है। इसके अलावा, मैं history -nबहुत अविश्वसनीय था।
12

1
एक नुकसान: मल्टी-लाइन स्ट्रिंग्स वाले कमांड्स को वर्तमान सत्र में आम तौर पर संरक्षित किया जाता है। इस चाल के साथ, वे तुरन्त व्यक्तिगत लाइनों में विभाजित हो जाते हैं। -N -c के लिए -n का उपयोग करने में मदद नहीं करता है, न ही cmdhist या lithist करता है। मुझे नहीं लगता कि इस बिंदु पर कोई समाधान है।
जो लिस

24
इसे थोड़े समय के लिए आज़माने के बाद, मैंने वास्तव में पाया है कि केवल history -a, बिना -cऔर -r, बेहतर प्रयोज्य-वार चल रहा है (हालाँकि यह वह प्रश्न नहीं है जो पूछा गया है)। इसका मतलब है कि आपके द्वारा चलाए जाने वाले कमांड वर्तमान शेल से बाहर निकलने से पहले ही नए गोले में तुरंत उपलब्ध हैं, लेकिन समवर्ती रूप से चलने वाले गोले में नहीं। इस तरह एरो-अप अभी भी वर्तमान सत्र के अंतिम-रन कमांड का चयन करता है , जो मुझे बहुत कम भ्रमित लगता है।
Jo Liss

उत्कृष्ट रूप से अच्छा जवाब, यह मज़बूती से अधिक सामान्य "इतिहास-ए; इतिहास-एन" के विपरीत है
रिचवेल

42

मैं किसी भी तरह का उपयोग करने के बारे में पता नहीं हूँ bash। लेकिन यह सबसे लोकप्रिय विशेषताओं में से एक है zsh
व्यक्तिगत रूप से मैं पसंद zshकरता bashहूं इसलिए मैं इसे आजमाने की सलाह देता हूं।

यहाँ मेरा हिस्सा है .zshrcकि इतिहास के साथ संबंधित है:

SAVEHIST=10000 # Number of entries
HISTSIZE=10000
HISTFILE=~/.zsh/history # File
setopt APPEND_HISTORY # Don't erase history
setopt EXTENDED_HISTORY # Add additional data to history like timestamp
setopt INC_APPEND_HISTORY # Add immediately
setopt HIST_FIND_NO_DUPS # Don't show duplicates in search
setopt HIST_IGNORE_SPACE # Don't preserve spaces. You may want to turn it off
setopt NO_HIST_BEEP # Don't beep
setopt SHARE_HISTORY # Share history between session/terminals


16

ऐसा करने के लिए, आपको अपनी दो पंक्तियों को जोड़ना होगा ~/.bashrc:

shopt -s histappend
PROMPT_COMMAND="history -a;history -c;history -r;$PROMPT_COMMAND"

से man bash:

यदि हिस्टापेंड शेल विकल्प सक्षम है (नीचे शेल बिल्डिंग्स के तहत शॉप्ट का विवरण देखें), लाइनें इतिहास फ़ाइल में संलग्न हैं, अन्यथा इतिहास फ़ाइल ओवर-लिखित है।


10

"इतिहास-ए" और "इतिहास -r" को चलाने के लिए आप अपने BASH प्रॉम्प्ट को संपादित कर सकते हैं जिसे मुएर ने सुझाया था:

savePS1=$PS1

(यदि आप कुछ गड़बड़ करते हैं, जो लगभग गारंटी है)

PS1=$savePS1`history -a;history -r`

(ध्यान दें कि ये बैक-टिक्स हैं; वे प्रत्येक प्रॉम्प्ट पर इतिहास -a और इतिहास -r चलाएंगे। चूंकि वे किसी भी टेक्स्ट को आउटपुट नहीं करते हैं, इसलिए आपका प्रॉम्प्ट अपरिवर्तित होगा।

एक बार जब आप अपने PS1 चर को अपने इच्छित तरीके से सेट कर लेते हैं, तो इसे स्थायी रूप से अपनी ~ / .bashrc फ़ाइल में सेट करें।

यदि आप परीक्षण करते समय अपने मूल संकेत पर वापस जाना चाहते हैं, तो करें:

PS1=$savePS1

मैंने यह सुनिश्चित करने के लिए इस पर बुनियादी परीक्षण किया है कि यह किस प्रकार का काम करता है, लेकिन history -a;history -rहर संकेत पर चलने से किसी भी तरह के दुष्प्रभाव पर बात नहीं की जा सकती है ।


2
kch का समाधान खान से बेहतर काम करता है। मैं अब मेरे .bashrc में उनके समाधान का उपयोग कर रहा हूं।

9

यदि आपको एक bash या zsh इतिहास सिंक्रोनाइज़िंग सॉल्यूशन की आवश्यकता है जो नीचे दी गई समस्या को भी हल करता है, तो इसे http://ptspts.blogspot.com/2011/03/how-to-automatically-synchronize-shell.html पर देखें।

समस्या निम्नलिखित है: मेरे पास शेल विंडो ए में दो शेल विंडो ए और बी हैं। मैं चलाता हूं sleep 9999, और शेल विंडो बी में नींद पूरी होने का इंतजार किए बिना), मैं sleep 9999बैश इतिहास में देखना चाहता हूं ।

यहां अधिकांश अन्य समाधान इस समस्या का समाधान नहीं करेंगे, इसका कारण यह है कि वे अपने इतिहास में परिवर्तन का उपयोग करते हुए इतिहास फ़ाइल में लिख रहे हैं PROMPT_COMMANDया PS1, जिनमें से दोनों बहुत देर से निष्पादित कर रहे हैं, केवल sleep 9999कमांड समाप्त होने के बाद ।


1
यह एक अच्छा समाधान है, लेकिन मुझे कुछ सवाल मिले। 1. क्या मैं मूल .bash_history फ़ाइल का उपयोग कर सकता हूं, मैं नहीं चाहता कि मेरे $ HOME में कोई अन्य बैश इतिहास फ़ाइल मौजूद हो। 2. हो सकता है कि आपको इसके लिए एक github repo सेट करने पर विचार करना चाहिए।
weynhamz

ऐसा लगता है कि डिबग हुक को bashdb के साथ विवादित किया गया है, हर बार मैं बैश सत्र शुरू करने के बाद आउटपुट का पालन करता हूं। `` `डिबगर, बैशबड, रिलीज़ 4.2-0.8 कॉपीराइट 2002, 2003, 2004, 2006, 2007, 2008, 2009, 2010, 2011 रॉकी बर्नस्टीन यह मुफ्त सॉफ्टवेयर है, जिसे जीएनयू जनरल पब्लिक लाइसेंस द्वारा कवर किया गया है, और आपका स्वागत है। इसे बदलें और / या कुछ शर्तों के तहत इसकी प्रतियां वितरित करें। ** आंतरिक डिबग त्रुटि _Dbg_is_file (): फ़ाइल तर्क शून्य बैश: _Dbg_filenames [$ fullname]: खराब सरणी सबस्क्रिप्ट '``
weynhamz

@Techlive Zheng: 1. मूल .bash_history जानबूझकर समर्थित नहीं है, क्योंकि .merged_bash_history एक अलग फ़ाइल स्वरूप का उपयोग करता है, इसलिए यदि .merged_bash_history ठीक से लोड करने में विफल रहता है, तो संयोग से संचित इतिहास को नष्ट नहीं करेगा। डिजाइन द्वारा मजबूत, के रूप में रखा जाएगा। 2. एक गितुब रेपो सामान्य रूप से एक अच्छा विचार है, लेकिन मेरे पास इस परियोजना के लिए बनाए रखने का समय नहीं है, इसलिए मैं ऐसा नहीं कर रहा हूं। - हां, यह बैशबड के साथ संघर्ष करता है, और कोई आसान समाधान नहीं है (वे एक ही हुक का उपयोग करते हैं)। मैं एक फिक्स पर काम करने की योजना नहीं बना रहा हूं, लेकिन मैं पैच स्वीकार कर रहा हूं।
अंक

ठीक है धन्यवाद। मैं बहुत सरल और बेहतर व्यंग्य के साथ आया हूं।
weynhamz

@TechliveZheng: क्या आप हमारे साथ अपने सरल और बेहतर समाधान साझा करेंगे, इसलिए हम सभी इससे सीख सकते हैं? (यदि ऐसा है, तो कृपया प्रश्न का उत्तर जोड़ें।)
पीटी

8

आप history -aवर्तमान सत्र के इतिहास को हिस्टिफ़ाइल में जोड़ने के लिए उपयोग कर सकते हैं , फिर history -rअन्य टर्मिनलों पर हिस्टफ़ाइल को पढ़ने के लिए उपयोग कर सकते हैं। 


8

ठीक है, तो अंत में यह मुझे एक सभ्य समाधान खोजने के लिए गुस्सा आ गया:

# Write history after each command
_bash_history_append() {
    builtin history -a
}
PROMPT_COMMAND="_bash_history_append; $PROMPT_COMMAND"

इस सूत्र में जो कहा गया था, वह इस तरह का समामेलन है, सिवाय इसके कि मुझे यह समझ में नहीं आता कि आप हर आदेश के बाद वैश्विक इतिहास को क्यों लोड करेंगे। मैं बहुत ही कम परवाह करता हूं कि अन्य टर्मिनलों में क्या होता है, लेकिन मैं हमेशा आदेशों की श्रृंखला चलाता हूं, एक टर्मिनल में कहता हूं:

make
ls -lh target/*.foo
scp target/artifact.foo vm:~/

(सरलीकृत उदाहरण)

और दूसरे में:

pv ~/test.data | nc vm:5000 >> output
less output
mv output output.backup1

कोई रास्ता नहीं मैं चाहता हूँ कि कमांड को साझा किया जाए


1
प्रत्येक आदेश के बाद आप इतिहास को फिर से लोड करेंगे कारण यह है कि यह प्रश्न के लिए आवश्यक व्यवहार है (और इसलिए यह वास्तव में सवाल का जवाब नहीं देता है)।
माइकल होमर

2
@ मिचेलहोमर फेयर पॉइंट। बेझिझक डाउनवोट करें ताकि जवाब नीचे की ओर रहे, हालांकि, मैं इसे ओपी तक समझूंगा कि रिक्वेस्टेड बिहेवियर कितना खराब होगा, और यह सच है कि यह बहुत ही घिनौना सवाल है।
येरेक टी।

3
यहाँ पर, हाँ, यह एक उचित समझौता है। मेरी मुख्य शिकायत यह है कि मैं इतिहास खो रहा था। इसे रोकना चाहिए, भले ही इसका मतलब एक साथ सत्रों में तत्काल अपडेट न हो।
ओली

7

यहां एक विकल्प है जिसका मैं उपयोग करता हूं। यह बोझिल है, लेकिन यह उस मुद्दे को संबोधित करता है, जिसमें @axel_c का उल्लेख किया गया है जहां कभी-कभी आप प्रत्येक टर्मिनल में एक अलग इतिहास उदाहरण चाहते हैं (एक मेक के लिए, एक निगरानी के लिए, एक विम के लिए आदि)।

मैं एक अलग संलग्न इतिहास फ़ाइल रखता हूं जिसे मैं लगातार अपडेट करता हूं। मेरे पास हॉटकी के लिए निम्न मैप है:

history | grep -v history >> ~/master_history.txt

यह आपके घर की dir में Master_history.txt नामक एक फ़ाइल के लिए वर्तमान टर्मिनल से सभी इतिहास को जोड़ता है।

मेरे पास मास्टर इतिहास फ़ाइल के माध्यम से खोजने के लिए एक अलग हॉटकी है:

cat /home/toby/master_history.txt | grep -i

मैं बिल्ली का उपयोग करता हूँ | grep क्योंकि यह मेरे रेगेक्स में प्रवेश करने के लिए अंत में कर्सर को छोड़ देता है। ऐसा करने के लिए एक कम बदसूरत तरीका यह होगा कि इन कार्यों को पूरा करने के लिए अपने रास्ते पर कुछ स्क्रिप्ट जोड़ें, लेकिन हॉटकी मेरे उद्देश्यों के लिए काम करती है। मैं समय-समय पर उन अन्य मेजबानों से भी इतिहास को नीचे खींचूंगा, जिन पर मैंने काम किया है और उस इतिहास को अपने master_history.txt फ़ाइल में जोड़ा है।

यह हमेशा अच्छा लगता है कि आप जल्दी से खोज कर सकें और उस अजीब रीगेक्स को पा सकें जो आपने 7 महीने पहले बनाया था।


6

मैं उस अंतिम एक के लिए एक फिक्स की पेशकश कर सकता हूं: सुनिश्चित करें कि एनवी चर HISTCONTROL "इग्नोरस्पेस" (या "इग्नेबॉथ") को निर्दिष्ट नहीं करता है।

लेकिन मैं कई समवर्ती सत्रों के साथ आपके दर्द को महसूस करता हूं। यह बस बैश में अच्छी तरह से संभाला नहीं है।


6

यहाँ मेरे lesmana के उत्तर के लिए मेरी वृद्धि है । मुख्य अंतर यह है कि समवर्ती खिड़कियां इतिहास साझा नहीं करती हैं। इसका मतलब है कि आप अपनी खिड़कियों में काम कर सकते हैं, बिना अन्य खिड़कियों के संदर्भ में आपके वर्तमान खिड़कियों में लोड होने से।

यदि आप स्पष्ट रूप से 'इतिहास' टाइप करते हैं, या यदि आप एक नई विंडो खोलते हैं, तो आपको पिछले सभी विंडो से इतिहास मिलता है।

इसके अलावा, मैं अपनी मशीन पर टाइप की गई हर कमांड को संग्रह करने के लिए इस रणनीति का उपयोग करता हूं।

# Consistent and forever bash history
HISTSIZE=100000
HISTFILESIZE=$HISTSIZE
HISTCONTROL=ignorespace:ignoredups

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

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

history() {                  #5
  _bash_history_sync_and_reload
  builtin history "$@"
}

export HISTTIMEFORMAT="%y/%m/%d %H:%M:%S   "
PROMPT_COMMAND='history 1 >> ${HOME}/.bash_eternal_history'
PROMPT_COMMAND=_bash_history_sync;$PROMPT_COMMAND

5

मैंने इतिहास को एक फ़ाइल-प्रति-ट्टी में रखना चुना, क्योंकि कई लोग एक ही सर्वर पर काम कर सकते हैं - प्रत्येक सत्र के आदेशों को अलग करना ऑडिट करना आसान बनाता है।

# Convert /dev/nnn/X or /dev/nnnX to "nnnX"
HISTSUFFIX=`tty | sed 's/\///g;s/^dev//g'`
# History file is now .bash_history_pts0
HISTFILE=".bash_history_$HISTSUFFIX"
HISTTIMEFORMAT="%y-%m-%d %H:%M:%S "
HISTCONTROL=ignoredups:ignorespace
shopt -s histappend
HISTSIZE=1000
HISTFILESIZE=5000

इतिहास अब जैसा दिखता है:

user@host:~# test 123
user@host:~# test 5451
user@host:~# history
1  15-08-11 10:09:58 test 123
2  15-08-11 10:10:00 test 5451
3  15-08-11 10:10:02 history

इस तरह दिख रही फाइलों के साथ:

user@host:~# ls -la .bash*
-rw------- 1 root root  4275 Aug 11 09:42 .bash_history_pts0
-rw------- 1 root root    75 Aug 11 09:49 .bash_history_pts1
-rw-r--r-- 1 root root  3120 Aug 11 10:09 .bashrc

3

यहां मैं एक समस्या के बारे में बताऊंगा

export PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"

तथा

PROMPT_COMMAND="$PROMPT_COMMAND;history -a; history -n"

यदि आप स्रोत ~ / .bashrc चलाते हैं, तो $ PROMPT_COMMAND पसंद आएगा

"history -a; history -c; history -r history -a; history -c; history -r"

तथा

"history -a; history -n history -a; history -n"

प्रत्येक बार जब आप 'स्रोत ~ / .bashrc' चलाते हैं तो यह पुनरावृत्ति होती है। प्रत्येक बार 'स्रोत ~ / .bashrc' चलाने के बाद 'इको $ PROMPT_COMMAND' चलाकर आप PROMPT_COMMAND की जाँच कर सकते हैं।

आप देख सकते हैं कि कुछ आदेश स्पष्ट रूप से टूटे हुए हैं: "इतिहास-एन इतिहास-ए"। लेकिन अच्छी खबर यह है कि यह अभी भी काम करता है, क्योंकि अन्य भाग अभी भी एक वैध कमांड अनुक्रम बनाते हैं (बस कुछ आदेशों को दोहराव से निष्पादित करने के कारण कुछ अतिरिक्त लागत शामिल है। और इतना साफ नहीं है।)

व्यक्तिगत रूप से मैं निम्नलिखित सरल संस्करण का उपयोग करता हूं:

shopt -s histappend
PROMPT_COMMAND="history -a; history -c; history -r"

जिसमें अधिकांश कार्यक्षमताओं हैं, जबकि ऊपर उल्लिखित जैसा कोई मुद्दा नहीं है।

बनाने के लिए एक और बिंदु है: वास्तव में कुछ भी नहीं जादू है । PROMPT_COMMAND सिर्फ एक सादे बैश वातावरण चर है। बैश प्रॉम्प्ट ($ साइन) पाने से पहले इसमें कमांड निष्पादित हो जाते हैं। उदाहरण के लिए, आपका PROMPT_COMMAND "गूंज 123" है, और आप अपने टर्मिनल में "ls" चलाते हैं। प्रभाव "एलएस; गूंज 123" चलाने जैसा है।

$ PROMPT_COMMAND="echo 123"

आउटपुट (बस 'PROMPT_COMMAND = "गूंज 123", $ PROMPT_COMMAND' चलाने की तरह):

123

निम्नलिखित चलाएँ:

$ echo 3

उत्पादन:

3
123

"History -a" का उपयोग इतिहास कमांड को मेमोरी में ~ / .bash_history पर लिखने के लिए किया जाता है

"History -c" का प्रयोग मेमोरी में हिस्ट्री कमांड्स को क्लियर करने के लिए किया जाता है

"History -r" का उपयोग इतिहास कमांड को ~ / .bash_history से मेमोरी में पढ़ने के लिए किया जाता है

इतिहास कमांड स्पष्टीकरण यहाँ देखें: http://ss64.com/bash/history.html

पुनश्च: जैसा कि अन्य उपयोगकर्ताओं ने बताया है, निर्यात अनावश्यक है। देखें: .bashrc में निर्यात का उपयोग करना


2

मैंने प्रति सत्र एक इतिहास फ़ाइल सेट करने के लिए एक स्क्रिप्ट लिखी है या इसके आधार पर कार्य को पूरा करना है।

        # write existing history to the old file
        history -a

        # set new historyfile
        export HISTFILE="$1"
        export HISET=$1

        # touch the new file to make sure it exists
        touch $HISTFILE
        # load new history file
        history -r $HISTFILE

यह आवश्यक नहीं है कि हर इतिहास कमांड को बचाया जाए, लेकिन यह उन लोगों को बचाता है जिनकी मुझे परवाह है और फिर उन्हें हर कमांड से गुजरना आसान है। मेरा संस्करण सभी इतिहास फ़ाइलों को भी सूचीबद्ध करता है और उन सभी के माध्यम से खोज करने की क्षमता प्रदान करता है।

पूर्ण स्रोत: https://github.com/simotek/scripts-config/blob/master/hiset.sh


2

यहाँ एक समाधान है जो व्यक्तिगत सत्रों से इतिहास को नहीं मिलाता है!

मूल रूप से प्रत्येक को प्रत्येक सत्र के इतिहास को अलग-अलग संग्रहित करना होता है और इसे प्रत्येक प्रांप्ट पर फिर से बनाना होता है। हां, यह अधिक संसाधनों का उपयोग करता है, लेकिन यह उतना धीमा नहीं है जितना कि ध्वनि हो सकता है - विलंब केवल तब ही ध्यान देने योग्य होने लगता है जब आपके पास 100000 से अधिक इतिहास प्रविष्टियां हों।

यहाँ मूल तर्क है:

# on every prompt, save new history to dedicated file and recreate full history
# by reading all files, always keeping history from current session on top.
update_history () {
  history -a ${HISTFILE}.$$
  history -c
  history -r
  for f in `ls ${HISTFILE}.[0-9]* | grep -v "${HISTFILE}.$$\$"`; do
    history -r $f
  done
  history -r "${HISTFILE}.$$"
}
export PROMPT_COMMAND='update_history'

# merge session history into main history file on bash exit
merge_session_history () {
  cat ${HISTFILE}.$$ >> $HISTFILE
  rm ${HISTFILE}.$$
}
trap merge_session_history EXIT

एक पूर्ण समाधान के लिए इस जिप को देखें , जिसमें कुछ सुरक्षा उपाय और प्रदर्शन अनुकूलन शामिल हैं।


1

यह ZSH के लिए काम करता है

##############################################################################
# History Configuration for ZSH
##############################################################################
HISTSIZE=10000               #How many lines of history to keep in memory
HISTFILE=~/.zsh_history     #Where to save history to disk
SAVEHIST=10000               #Number of history entries to save to disk
#HISTDUP=erase               #Erase duplicates in the history file
setopt    appendhistory     #Append history to the history file (no overwriting)
setopt    sharehistory      #Share history across terminals
setopt    incappendhistory  #Immediately append to the history file, not just when a term is killed

दुर्भाग्य से सवाल बैश :-) के लिए सख्ती से है
जलेक्स

1
गूगल पर इसका पहला परिणाम जब मैंने zsh को खोजा ... सोचा कि यह मदद कर सकता है
मुल्की

3
आपको एक नया प्रश्न पूछना चाहिए, ~ "कई टर्मिनल विंडो में zsh इतिहास को संरक्षित करें", यह मानते हुए कि कोई पहले से मौजूद नहीं है। यदि यह एक अच्छा प्रश्न है तो अपने स्वयं के प्रश्न का उत्तर देने के लिए यह पूरी तरह से ठीक है-प्रोत्साहित किया गया।
ओली

1

मैं लंबे समय से यह चाहता था, विशेष रूप से एक कमांड को पुनः प्राप्त करने की क्षमता जहां यह एक नई परियोजना में फिर से निष्पादित करने के लिए चलाया गया था (या एक कमांड द्वारा एक निर्देशिका ढूंढना)। इसलिए मैंने इस टूल को एक साथ रखा, जो कि एक वैश्विक सीएलआई इतिहास को संरेखित करने के लिए एक इंटरेक्टिव ग्रीपिंग टूल के साथ पिछले समाधान को जोड़ता है जिसे पेरकोल (मैप्ड टू सी ^ आर) कहा जाता है। यह अभी भी पहली मशीन है जिस पर मैंने इसका उपयोग करना शुरू कर दिया है, अब> 2 वर्ष पुराने CLI इतिहास के साथ।

जहां तक ​​तीर कुंजियों का सवाल है, यह स्थानीय सीएलआई इतिहास के साथ खिलवाड़ नहीं करता है, लेकिन आपको वैश्विक इतिहास को काफी आसानी से एक्सेस करने देता है (जिसे आप C ^ R के अलावा किसी और चीज के लिए मैप कर सकते हैं)


यह zsh के लिए है?
sjas

1
हां, मैंने इसे शुरू में zsh के लिए बनाया था। समझे कि यह बैश और मछली के लिए भी काम कर रहा है। मुझे पता है कि यह काम करता है या नहीं। मैंने इसे थोड़ी देर में नहीं बदला है और मुझे यकीन नहीं है कि मैं अपने स्थापित निर्देशों में कितना स्पष्ट हूं
गॉर्डन वेल्स

1

क्योंकि मैं अनंत इतिहास पसंद करता हूं जो कस्टम फ़ाइल में सहेजा गया है। मैं यह विन्यास https://stackoverflow.com/a/19533853/4632019 पर आधारित बनाता हूं :

export HISTFILESIZE=
export HISTSIZE=
export HISTTIMEFORMAT="[%F %T] "

export HISTFILE=~/.bash_myhistory
PROMPT_COMMAND="history -a; history -r; $PROMPT_COMMAND"

-1

यहाँ मेरे स्नैबसेट से स्निपेट है और जहाँ भी आवश्यक हो, लघु स्पष्टीकरण:

# The following line ensures that history logs screen commands as well
shopt -s histappend

# This line makes the history file to be rewritten and reread at each bash prompt
PROMPT_COMMAND="$PROMPT_COMMAND;history -a; history -n"
# Have lots of history
HISTSIZE=100000         # remember the last 100000 commands
HISTFILESIZE=100000     # start truncating commands after 100000 lines
HISTCONTROL=ignoreboth  # ignoreboth is shorthand for ignorespace and     ignoredups

HISTFILESIZE और HISTSIZE व्यक्तिगत प्राथमिकताएं हैं और आप उन्हें अपने स्वाद के अनुसार बदल सकते हैं।

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