मैं इतिहास को सहेजे बिना टर्मिनल को कैसे बंद कर सकता हूं?


33

एक से अधिक बार मैंने गलती से कई कमांड चलाए और अपने बैश इतिहास को प्रदूषित किया। मैं अपने बैश इतिहास को सहेजे बिना अपने टर्मिनल को कैसे बंद करूं? मैं फेडोरा का उपयोग कर रहा हूं।

जवाबों:


25

आपकी शेल का इतिहास HISTFILEचर द्वारा इंगित फ़ाइल में सहेजा गया है। इसलिए:

unset HISTFILE

यह zsh पर भी लागू होता है, लेकिन ksh के लिए नहीं जो $HISTFILEशेल शुरू होने पर इंगित की गई फ़ाइल में सहेजता रहता है (और इसके विपरीत, आप खोल शुरू करने के बाद अपने इतिहास को ksh में सहेजने का निर्णय लेते हैं)।


मैं इतिहास को प्रदूषित करने के बाद लॉग आउट करने से पहले इसका उपयोग कर सकता हूं? और इस सत्र के लिए इसकी वासना? मैं set HISTFILEअगली बार जब मैं लॉग इन करने की जरूरत नहीं है? (सिर्फ यह कहें कि यह सही है या गलत है)

@ acidzombie24 यह सही है, जब तक आप स्पष्ट रूप से परिवर्तनों को rc फ़ाइलों में संग्रहीत नहीं करते हैं, तब तक पर्यावरण चर में परिवर्तन को सत्रों में सहेजा नहीं जाता है।
jw013

31

संक्षिप्त जवाब:

इसे प्रॉम्प्ट पर टाइप करें:

$ kill -9 $$

यह आपके शेल को तुरंत ही मार देगा बिना शेल के कुछ भी नहीं कर सकता जैसे सिग्नल को फंसाना, इतिहास को बचाना, निष्पादित करना ~/.bash_logout, रोकी गई नौकरियों के बारे में चेतावनी देना, या उस अच्छे सामान में से कोई भी।

लंबा जवाब:

नोट: ये विकल्प परस्पर अनन्य नहीं हैं ; वे सभी एक ही बार में उपयोग किए जा सकते हैं।

विकल्प 1:

यदि आप एक पूर्णतावादी हैं, जब यह आपकी इतिहास फ़ाइल को अव्यवस्थित करने की बात आती है, तो आप जो कर सकते हैं वह HISTIGNOREचर को संशोधित करने के लिए उन कमांड के ग्लोब को शामिल करना है जिन्हें आप रिकॉर्ड नहीं करना चाहते हैं। उदाहरण के लिए, यदि आप HISTIGNORE='ls*:cd*'अपने ~/.bashrcकिसी भी उदाहरण में जोड़ते हैं lsऔर cdअपनी इतिहास फ़ाइल में सम्मिलित नहीं होते हैं।

विकल्प 2:

यदि आप एक कमांड-बाय-कमांड के आधार पर नियंत्रित करना चाहते हैं कि आपके इतिहास से कौन सी कमांड बची हुई हैं, तो आप सेट कर सकते हैं HISTCONTROL='ignorespace'जो किसी कमांड लाइन को स्पेस से शुरू करने से रोक देगा। का उपयोग ignorebothकरना भी दोहराया लाइनों को छोड़ देना होगा। फिर, कमांड दर्ज करने से पहले स्पेस बार को हिट करने से यह आपके इतिहास की फाइल में दिखाई नहीं देगा।

विकल्प 3:

यदि आप बस इसे बनाना चाहते हैं तो जब आप टर्मिनल को बंद कर देते हैं तो शेल तुरंत बाहर निकल जाता है, तो आप trapसंकेत दे सकते हैं कि टर्मिनल प्रोग्राम शेल भेजता है ( xtermउदाहरण के लिए, SIGHUPफिर शेल के बाहर निकलने का इंतजार करता है) और इतिहास को सहेजे बिना बाहर निकलें। यह संकेत प्राप्त करता है। इसे अपने में जोड़ें ~/.bashrc:

# don't record history when the window is closed
trap 'unset HISTFILE; exit' SIGHUP

2
'मार -9 $ $' विधि के लिए +1। यह निश्चित रूप से उन स्थितियों के आसपास का एक तरीका है जहां HISTIGNORE, आदि को केवल-पढ़ने के लिए सेट किया गया है।
कोरी हेंडरसन

7
मुझे नहीं लगता कि kill -9जब कुछ और सब कुछ विफल हो गया है, तो गंभीर स्थितियों को छोड़कर किसी भी चीज़ का उपयोग करने को बढ़ावा देना एक अच्छा विचार है ।
क्रिस्टोफर हम्मरस्ट्रॉम

1
SIGKILL भेजना कभी भी मानक संचालन प्रक्रिया के रूप में एक अच्छा विचार नहीं है। उचित प्रक्रियाओं का उपयोग करें, जैसे कि HISTFILE को परेशान करना।
Arcege


मैं इसके विपरीत जानना चाहता था - कैसे मार मारना सुनिश्चित करें कि यह उसके इतिहास को बचा लेगा - और इसने मेरे सवाल का जवाब दिया, धन्यवाद।
मावेरोन

3

मुझे यह देखकर आश्चर्य हुआ कि किसी ने history -cतुरंत पहले सुझाव नहीं दिया है exit। IINM (मैं कोई विशेषज्ञ नहीं हूँ) जो अच्छी तरह से करेंगे।


2
आप सही रास्ते पर हैं: history -rइतिहास फ़ाइल को फिर से पढ़ेंगे, इसलिए बचत एक विकल्प नहीं है।
साइमन रिक्टर

इतिहास से खिलवाड़ करना एक बुरी आदत है ... खोल इतिहास में बहुत उपयोगी जानकारी है कि किसने क्या किया। यह उन लोगों के लिए बहुत उपयोगी है जो आपके प्लेटफ़ॉर्म पर नए हैं (जब तक कि आप प्रलेखन, परिवर्तन प्रबंधन के बारे में 100% आश्वस्त न हों)
फ्रैंकलिन पिअत

2

दो पर्यावरण चर हैं जो इतिहास फ़ाइल को निर्धारित करने के लिए बैश का उपयोग करते हैं और शेल के बाहर निकलने पर इसे लिखने के लिए कितनी लाइनें हैं।

आप इनमें से किसी के साथ अपने सत्र के इतिहास को फेंक सकते हैं (सत्र के दौरान सेट करें जिसे आप अपनी इतिहास फ़ाइल से छोड़ना चाहते हैं):

HISTFILE=/dev/null

या

HISTSIZE=0

या तो इनमें से फेडोरा पर बैश में काम ठीक है


1

यकीन नहीं होता कि आप अपने कमांड इतिहास की इतनी परवाह क्यों करते हैं। यदि आपको अक्सर कुछ आदेशों की आवश्यकता होती है, तो आपको अधिक मज़ा आ सकता है यदि आप उनके लिए उपनाम परिभाषित करते हैं ताकि आप उन्हें इतिहास में देखने के बजाय दो कीस्ट्रोक्स के साथ वापस पा सकें।


0
  1. एली ने पहले ही आपको बैश के लिए सही उत्तर दिया जो सेट करना हैHISTSIZE=0

  2. मैं बस इसे GNU स्क्रीन के लिए करने की विधि जोड़ूंगा । प्रेस Ctrl+A(स्क्रीन एस्केप अनुक्रम) के बाद :scrollback 0। यह स्क्रॉल-बैक इतिहास को हटा देगा। अब आप तुरंत :scrollback 15000स्क्रॉल-बैक बफर आकार रीसेट करने के लिए कर सकते हैं ।


ओपी ने कब कहा कि वे उपयोग कर रहे थे screen(1)?
एम्फ़ैटेमाचिन

उसने नहीं किया। लेकिन, आप एक स्क्रीन सत्र के अंदर बैश चल सकते हैं और HISTSIZE = 0 अभी भी स्क्रीन के स्क्रॉल-बैक बफर में आपकी गतिविधि का विवरण छोड़ देगा। इसलिए, यदि आप वास्तव में इसे साफ करना चाहते हैं, तो आपको भी ऐसा करना होगा scrollback=0
gsbabil

स्क्रॉलबैक बफ़र साफ़ किया जाता है जब विंडो बंद हो जाती है (यानी जब शेल बाहर निकलता है)। यदि आपने Ctrl-A H टाइप किया है तो क्या होगा? क्या यह लॉगफाइल को मार देगा?
एम्फ़ैटेमाचिन

@amphetamachine: नहीं, यह केवल वर्तमान विंडो की लॉगिंग शुरू / समाप्त करेगा। पड़ोसी Ctrl+a HCtrl+a :clearतो इतिहास को हटाएगा। आपको चाहिए Ctrl+a :scrollback 0। आप स्वयं इसका परीक्षण कर सकते हैं। एक नया स्क्रीन सत्र प्रारंभ करें। अब ए cat /etc/passwd। अब, उपरोक्त में से कोई भी करें - Ctrl+a Hया Ctrl+a :clear। अब, स्क्रीन बफ़र से कॉपी करने की कोशिश करें, Ctrl+a [इसके बाद ऊपर जाने के लिए अप-ऐरो द्वारा डोनिग करें और देखें कि आप कॉपी करने के लिए कितनी दूर जा सकते हैं। यदि आपने a का Ctrl+a :scrollbackअनुसरण किया है clear, तो आप केवल उतना ही आगे बढ़ेंगे जितना आप वर्तमान विंडो में देख सकते हैं क्योंकि कोई स्क्रॉलबैक बफर नहीं होगा।
gsbabil
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.