तो हाँ, यह एक पुराना विषय है, लेकिन इन सवालों में से किसी ने भी मेरे लिए इसका जवाब नहीं दिया इसलिए मैंने अभी उम्र का पता लगाने की कोशिश की है!
यहां '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 इस फ़ंक्शन का नाम इतिहास फ़ाइल में न जोड़े, अंतिम प्रविष्टि जिसे हम चाहते हैं: डी।