क्या इतिहास की फाइलें बैश में एकीकृत की जा सकती हैं?


35

मैं नियमित रूप से screenअपने लिनक्स डेस्कटॉप और सर्वर पर कई सत्र चलाता हूं।

इसके साथ एक समस्या यह है कि जब मैं grepअपने कमांड इतिहास के माध्यम से, मुझे लगता है कि मैंने एक अलग सत्र में एक आदेश जारी किया है, और उस इतिहास आइटम को प्राप्त करने के लिए अलग करना और फिर से संलग्न करना है।

क्या कई सत्रों से सभी केंद्रीय इतिहास में जाने के लिए अलग-अलग अपडेट किए गए इतिहास को 'मजबूर' करना संभव है?


मैं इसी तरह के मुद्दे पर भाग गया, जिससे मैं टर्मिनल सत्रों के बीच इतिहास को देखने में सक्षम नहीं था। मेरी ~ / .bash_history फ़ाइल को चालू किया गया था जो रूट के स्वामित्व में थी और न कि लिखने योग्य थी। मेरे उपयोगकर्ता को स्वामी / समूह बदलने से यह समस्या ठीक हो गई: sudo chown <user>: <group> ~ / .bash_history
mateo

जवाबों:


41

आपको दो काम करने होंगे:

  1. shopt -s histappendअपने में कमांड डालें .bashrc। यह इसे अधिलेखित करने के बजाय इतिहास फ़ाइल में जोड़ देगा।
  2. इसके अलावा, आपके द्वारा .bashrcडाला गया PROMPT_COMMAND="$PROMPT_COMMAND;history -a; history -n"और इतिहास की फाइल को फिर से लिखा जाएगा और प्रत्येक बार बैश के संकेत को फिर से पढ़ा जाएगा।

EDIT: history -nट्रिक के लिए e-t172 का धन्यवाद


6
इसके लिए धन्यवाद। मैंने PROMPT_COMMAND = "$ PROMPT_COMMAND; इतिहास -a; इतिहास -n" का उपयोग करके इसे और बेहतर बनाया। इस तरह, अन्य सत्रों में जारी किए गए आदेश तुरंत वर्तमान सत्र के इतिहास में दिखाई देते हैं (ठीक है, आपको इतिहास को अपडेट करने के लिए पहले Enter दबाएं)।
एटिने डेकाॅम्प्स

8
मैंने PROMPT_COMMANDपहले परिभाषित नहीं किया था, इसलिए मुझे PROMPT_COMMAND="history -a; history -n"त्रुटियों से बचने के लिए उपयोग करना था ।
विलियम जैक्सन

1
कृपया सही इतिहास -a, -c, और -r कमांड के लिए superuser.com/a/734410/250287 उत्तर देखें ।
mtd

नवागंतुक को बस एक चेतावनी: थोड़ी देर के लिए इतिहास पुनर्लेखन का उपयोग करने के बाद, मुझे एहसास हुआ कि मैं अक्सर गलत आदेश जारी कर रहा था; जब आप पिछली पंक्ति में कुछ कमांड देखते हैं, तो आप इसे दोहराने के लिए तीर की अपेक्षा करते हैं, और इस कॉन्फ़िगरेशन के साथ अब हमेशा ऐसा नहीं होता है।
टिआगो

11

कृपया उपयोग न करें history -a; history -n, यह आपकी अपेक्षा के अनुरूप काम नहीं करता है और आपके इतिहास में आदेश आदेशों से हटकर आपको कई डुप्लिकेट के साथ छोड़ देगा। एक समाधान जो आम तौर पर उम्मीद के मुताबिक काम करता है, वह है:

# unified bash history
shopt -s histappend
PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"

अर्धविराम के बजाय एक नई पंक्ति का उपयोग करना PROMPT_COMMAND के साथ अनुपलब्ध / डुप्लिकेट अर्धविराम समस्या से निपटने का एक छोटा तरीका है।


इतिहास -a, -c, और उसके बाद -r सही है ... यह स्वीकृत उत्तर होना चाहिए
mtd

1
exportआवश्यक नहीं है। क्योंकि इंटरेक्टिव शेल विकल्प निर्धारित किए जाते हैं ~/.bashrc, जिससे प्रत्येक उप शेल से कॉल किया जाता है, इसलिए इनहेरिटेंस आवश्यक नहीं है।
dolmen

वहाँ एक अच्छा कारण के PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"बजाय सिर्फ उपयोग नहीं है ?
छह

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

-1

PROMPT_COMMAND डिफ़ॉल्ट रूप से कुछ डिस्ट्रोस में परिभाषित नहीं है। उदाहरण के लिए, इसे आर्क में परिभाषित किया गया है, लेकिन डेबियन में नहीं।

मेरे ड्रॉपबॉक्स में एक bashrc है जिसे मैं distro hopping करते समय उपयोग करता हूं, और इसमें शामिल हैं:

PROMPT_COMMAND="$( [ '$PROMPT_COMMAND' ] && echo $PROMPT_COMMAND; )history -a; history -n"

एक मूल शेल प्रोग्रामिंग समस्या का एक भयानक समाधान। सही तरीका:PROMPT_COMMAND="$PROMPT_COMMAND; history -a; history -n"
dolmen 13

बेहतर:PROMPT_COMMAND="$PROMPT_COMMAND"$'\n''history -a; history -n'
dolmen 14
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.