Zsh इतिहास से अंतिम कमांड (या बोनस के लिए वर्तमान कमांड) कैसे हटाएं


14

यकीन है कि ऐसा करने के लिए एक सुपर सरल तरीका है, लेकिन चूंकि zshell में इतिहास को लगता है कि fc को aliased किया जा रहा है, इसलिए इतिहास में एक लाइन को हटाने के लिए बताए गए ट्रिक्स का उपयोग करने का कोई तरीका नहीं है ?

यह कैसे करना है पर कोई संकेत? मेरा उपयोग मामला इतिहास से अंतिम जारी आदेश को हटाने के लिए होगा, इसलिए यह स्वतः पूर्ण करना बंद कर देता है (ज्यादातर जब आपने कुछ गलत किया है और यह दिखाता रहता है)।

मुझे पता है कि मैं अंतिम आदेश जारी करके प्राप्त कर सकता हूं

history | tail -n 1, लेकिन इतिहास -d काम नहीं करता है और मुझे zsh के लिए उचित दस्तावेज नहीं मिल रहे हैं।

जवाबों:


9

Zsh एक वास्तविक इतिहास संस्करण सुविधा प्रदान नहीं करता है। कमांड इतिहास मूल रूप से केवल-पढ़ने के लिए है। तुम सब कर सकते हैं यह थोक की जगह है।

कमांड लाइन इतिहास संपादित करने के लिए:

  1. इसे एक फ़ाइल में सहेजें: fc -W
  2. फ़ाइल को संपादित करें
  3. फ़ाइल से इतिहास लोड करें: fc -R

आप सेटिंग से फाइल का नाम चुन सकते हैं HISTFILE

अयोग्य कोड:

remove_last_history_entry () {
  setopt local_options extended_history no_hist_save_no_dups err_return

  local HISTFILE=~/.zsh_history_tmp_$$ SAVEHIST=$HISTSIZE
  fc -W
  ed -s $HISTFILE <<EOF >/dev/null
d
w
q
EOF
  fc -R
}

6

आमतौर पर आप बस से लाइन को हटा सकते हैं ~/.zsh_history, लेकिन अगर आप इसे ~/.zshrcअपने इतिहास फ़ाइल के स्थान के लिए नहीं देख सकते हैं ।

फिर अपनी पसंद के किसी भी टेक्स्ट एडिटर का उपयोग आपत्तिजनक लाइन (ओं) को हटाने के लिए करें। वैकल्पिक रूप से, बस पूरी फ़ाइल को हटा दें और सभी zsh इंस्टेंस को बंद करें और एक नई शुरुआत करें। इतिहास शुद्ध!


2

तो हाँ, यह एक पुराना विषय है, लेकिन इन सवालों में से किसी ने भी मेरे लिए इसका जवाब नहीं दिया इसलिए मैंने अभी उम्र का पता लगाने की कोशिश की है!

यहां 'fc -R' और 'fc -W' :) का उपयोग करने के संकेत के लिए @Gilles से धन्यवाद के साथ मेरा समाधान है

नीचे दी गई स्क्रिप्ट को अपनी .zshrc फ़ाइल में पेस्ट करें।

स्रोत के साथ पुनः लोड करें .zshrc

फिर अंतिम कमांड को भूलने के लिए 'भूल' टाइप करें: डी। पिछले 3 आदेशों को भूलने के लिए '3 भूल जाओ' टाइप करें। कुछ सेक्सी शिज़

ऊपर तीर दबाने से आप सीधे अंतिम कमांड पर पहुंच जाएंगे और 'भूल' शब्द भी याद नहीं रखेंगे :)।

अपडेट किया गया: घर का रास्ता जोड़ा गया, इसलिए यह अब सभी निर्देशिकाओं में काम करता है।

अपडेट 2: अंतिम आदेशों की संख्या को पारित करने की क्षमता को जोड़ा गया जिन्हें आप भूलना चाहते हैं: डी। अंतिम 2 आदेशों को भूलने के लिए 'भूलने के लिए 2' का प्रयास करें: डी।

# Put a space at the start of a command to make sure it doesn't get added to the history.
setopt histignorespace

alias forget=' my_remove_last_history_entry' # Added a space in 'my_remove_last_history_entry' so that zsh forgets the 'forget' command :).

# ZSH's history is different from bash,
# so here's my fucntion to remove
# the last item from history.
my_remove_last_history_entry() {
    # This sub-function checks if the argument passed is a number.
    # Thanks to @yabt on stackoverflow for this :).
    is_int() ( return $(test "$@" -eq "$@" > /dev/null 2>&1); )

    # Set history file's location
    history_file="${HOME}/.zsh_history"
    history_temp_file="${history_file}.tmp"
    line_cout=$(wc -l $history_file)

    # Check if the user passed a number,
    # so we can delete x lines from history.
    lines_to_remove=1
    if [ $# -eq 0 ]; then
        # No arguments supplied, so set to one.
        lines_to_remove=1
    else
        # An argument passed. Check if it's a number.
        if $(is_int "${1}"); then
            lines_to_remove="$1"
        else
            echo "Unknown argument passed. Exiting..."
            return
        fi
    fi

    # Make the number negative, since head -n needs to be negative.
    lines_to_remove="-${lines_to_remove}"

    fc -W # write current shell's history to the history file.

    # Get the files contents minus the last entry(head -n -1 does that)
    #cat $history_file | head -n -1 &> $history_temp_file
    cat $history_file | head -n "${lines_to_remove}" &> $history_temp_file
    mv "$history_temp_file" "$history_file"

    fc -R # read history file.
}

इसलिए यहां कुछ चीजें चल रही हैं। यह कमांड हमें किसी भी कमांड से पहले एक स्पेस टाइप करने देगा और इसे इतिहास में नहीं जोड़ा जाएगा।

setopt histignorespace

इसलिए हम स्पेस बार को दबा सकते हैं, और 'इको हाय' टाइप कर सकते हैं, एंटर दबा सकते हैं और जब हम ऊपर तीर दबाते हैं, तो 'इको हाय' हमारे इतिहास में नहीं है :)।

ध्यान दें कि कैसे उपनाम 'भूल' my_remove_last_history_entry से पहले एक स्थान है। यह इतना है कि zsh इतिहास के लिए हमारे 'भूल' नहीं बचा है।

फंक्शन ने समझाया

ZSH इतिहास या कुछ और के लिए fc का उपयोग करता है, इसलिए हम इतिहास फ़ाइल में अपनी वर्तमान कमांड लिखने के लिए 'fc -W' करते हैं, वे हम फाइल को अंतिम कमांड को ट्रिम करने के लिए 'head -n -1' का उपयोग करते हैं। हम उस आउटपुट को एक अस्थायी फ़ाइल में सहेजते हैं और फिर मूल इतिहास फ़ाइल को अस्थायी एक के साथ बदलते हैं। और अंत में इतिहास को fc -R के साथ पुनः लोड करें।

हालांकि फ़ंक्शन के साथ एक समस्या है जो उर्फ ​​के साथ तय की गई है।

यदि हम फ़ंक्शन को इसके नाम से चलाते हैं, तो यह अंतिम कमांड को हटा देगा, जो फ़ंक्शन को कॉल करता है। यही कारण है कि हम एक स्थान का उपयोग करके कॉल के साथ उपनाम का उपयोग करते हैं, ताकि zsh इस फ़ंक्शन का नाम इतिहास फ़ाइल में न जोड़े, अंतिम प्रविष्टि जिसे हम चाहते हैं: डी।


क्या होगा यदि अंतिम कमांड मल्टी-लाइन थी?
avp

इसे आधिकारिक उत्तर के रूप में वोट दिया जाना चाहिए। धन्यवाद।
gsl

1

में zsh, histignorespaceविकल्प ( set -o histignorespace) सेट करें । और में bash, जोड़ने ignorespaceया ignoreboth(कुछ वितरण पहले से ही डिफ़ॉल्ट में ~/.bashrc) $HISTCONTROLया सेट करने के लिए HISTIGNORE=' *', और फिर आप इसे रिकॉर्ड करने से बचने के लिए <space> के साथ वर्तमान कमांड शुरू कर सकते हैं ।

:
 : none
fc -nl -1

:

में zsh, आप अभी भी उस पिछले कमांड को एक बार याद कर सकते हैं, लेकिन यह इतिहास में संग्रहीत नहीं है।


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