ZSH में इतिहास से एक प्रविष्टि कैसे निकालें


79

मान लीजिए कि मैंने एक zsh का उपयोग करके एक कमांड चलाई

echo "mysecret" > file

मैं कमांड का उपयोग करके आसानी से प्रवेश संख्या सहित इतिहास को प्रिंट कर सकता हूं fc -l:

1  echo "mysecret" >| file

लेकिन मैं इतिहास से प्रविष्टि को आसानी से कैसे हटा सकता हूं?

मैं आदमी zshbuiltins में एक संबंधित पैराग्राफ नहीं ढूँढ सकता ।


2
यह SuperUser के विपरीत StackOverflow पर क्या कर रहा है?
चार्ल्स डफी

जवाबों:


96

* बीएसडी / डार्विन (macOS):

LC_ALL=C sed -i '' '/porn/d' $HISTFILE

लिनक्स (GNU sed):

LC_ALL=C sed -i '/porn/d' $HISTFILE

यह आपके $ HISTFILE से "पोर्न" से मेल खाने वाली सभी लाइनों को हटा देगा।

इसके साथ setopt HIST_IGNORE_SPACE, आप उपरोक्त कमांड को $ HISTFILE पर लिखे जाने से रोकने के लिए एक स्पेस कैरेक्टर के साथ प्रीपेंड कर सकते हैं।

जैसा कि टिम ने अपनी टिप्पणी में बताया , उपसर्ग LC_ALL = C 'अवैध बाइट अनुक्रम' को रोकता है।


1
ओबीएक्स / बीएसडी पर एनबी आपको -आई के बाद खाली उद्धरण डालने की जरूरत है ताकि स्पष्ट रूप से कोई बैकअप फ़ाइल न हो, इस प्रकार sed -i '' '/S3_SECRET/d' $HISTFILE:। यह लिनक्स पर काम नहीं करेगा। stackoverflow.com/questions/5694228/…
टिम डिगिन्स

3
और यदि आपको 'अवैध बाइट अनुक्रम' मिलता है, तो LC_ALL = C सेट करें, इस प्रकार: LC_ALL=C sed -i '' '/S3_SECRET/d' $HISTFILE stackoverflow.com/questions/11287564/…
टिम डिगिन्स

54

मुझे नहीं पता कि ऐसा करने के लिए कुछ सुरुचिपूर्ण तरीका है, लेकिन इसी तरह की स्थितियों में मैंने लॉग आउट किया है (zsh को इसके बफर को खाली करने और फाइल करने के लिए अपना इतिहास लिखने की अनुमति देता है), फिर लॉग इन किया और अंत में मैन्युअल रूप से संपादित किया गया ~/.zsh_history , "हटाना" खतरनाक "लाइन।


मेरे लिए काम किया। मुझे इसके लिए अपने टर्मिनल को पुनः आरंभ करना पड़ा, इसके लिए परिवर्तनों पर उठाया गया।
विल्ट्सचर्ज़

बोनस अंक के लिए, पर्यावरण चर सेट करके इतिहास फ़ाइल को लोड करने से बचें HISTFILE=/dev/null, या बस एक और शेल का उपयोग करें। यदि zshलॉगिन शेल है, तो लॉगिन करें और exec shफिर संपादित करें ~/.zhistory
gnucchi

यह वास्तव में कारगर है! से कमांड हटाएं ~/.zsh_history, फिर zsh को पुनरारंभ करें।
Ferris

29

यदि आप zst में HIST_IGNORE_SPACE विकल्प का उपयोग करते हैं तो आप कमांड को एक स्थान के साथ "" रोक सकते हैं और वे इतिहास फ़ाइल में याद नहीं किए जाएंगे। यदि आपके पास गुप्त आज्ञाएं हैं जो आप आमतौर पर उपयोग करते हैं, तो आप की तर्ज पर कुछ कर सकते हैं: उर्फ हिडनकमैंड = 'हिडनकमैंड'


5
डाल setopt histignorespaceमें~/.zshrc
टिम अबेल

के लिए धन्यवाद histignorespace। बहुत उपयोगी !
मत्तेयो गगिनजियो

1

यह फ़ंक्शन आपके Zsh इतिहास से इच्छित कोई भी एक पंक्ति निकाल देगा, कोई प्रश्न नहीं पूछा गया:

# Accepts one history line number as argument.
# Alternatively, you can do `dc -1` to remove the last line.
dc () {
  # Prevent the specified history line from being saved.
  local HISTORY_IGNORE="${(b)$(fc -ln $1 $1)}"

  # Write out the history to file, excluding lines that match `$HISTORY_IGNORE`.
  fc -W

  # Dispose of the current history and read the new history from file.
  fc -p $HISTFILE $HISTSIZE $SAVEHIST

  # TA-DA!
  print "Deleted '$HISTORY_IGNORE' from history."
}

यदि आप अतिरिक्त रूप से सभी dcआदेशों को इतिहास में लिखे जाने से रोकना चाहते हैं , तो अपनी ~/.zshrcफ़ाइल में निम्न जोड़ें :

zshaddhistory() {
 [[ $1 != 'dc '* ]]
}

अपडेट करें

मैंने अब एक प्लगइन के रूप में एक अधिक व्यापक समाधान प्रकाशित किया है: https://github.com/marlonrichert/zsh-hist


-2

में बैश :

1- बैश टर्मिनल प्रकार में

hsitory # यह इतिहास में सभी आदेशों को सूचीबद्ध करेगा। लाइन नंबर के साथ .bash_history फ़ाइल

पूर्व:

  ...
  987  cd
  988  ssh x@127.0.0.1
  990  exit
  991  cd

2- जिस सीएमडी लाइन नंबर को आप हटाना चाहते हैं, उसे चुनें

history -d 988

नोट: यदि आप पिछले 3 CMD उदाहरण के लिए हटाना चाहते हैं, तो बस तीसरी पंक्ति संख्या को नीचे से बाहर निकालें: 988 और history -d 988क्रम में CMD को 3 बार दोहराएं ।

स्रोत


3
history -dZSH में काम नहीं करता है क्योंकि यह केवल उर्फ ​​के लिए है fc -l 1और यह fc: event not found: -dत्रुटि के साथ समाप्त होता है ।
विरेन

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