Zsh ইতিহাস থেকে কীভাবে শেষ কমান্ডটি (বা বোনাসের জন্য বর্তমান কমান্ড) সরিয়ে ফেলবেন


14

নিশ্চিত যে এটি করার একটি দুর্দান্ত সহজ স্মার্ট উপায় আছে, তবে যেহেতু জেসেলের ইতিহাস চূড়ান্তভাবে এফসি করা হয়েছে, সুতরাং ইতিহাস থেকে কোনও একক লাইন কীভাবে মুছে ফেলা যায় তার উল্লিখিত কৌশলগুলি ব্যবহার করার উপায় নেই ?

এটি করার জন্য কোনও পয়েন্টার? আমার ব্যবহারের ক্ষেত্রে ইতিহাস থেকে শেষ জারি করা কমান্ডটি সরিয়ে ফেলা হবে যাতে এটি স্বয়ংক্রিয়রূপে বন্ধ হয়ে যায় (বেশিরভাগ সময় যখন আপনি কোনও কিছুকে ভুল টাইপ করেন এবং এটি প্রদর্শিত থাকে)।

আমি জানি আমি করে শেষ জারি করা আদেশটি পেতে পারি

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 ' ব্যবহারের ইঙ্গিতটির জন্য ধন্যবাদ সহ আমার সমাধান এখানে

এর নিচে স্ক্রিপ্টটি আপনার .zshrc ফাইলে আটকান।

উত্স .zshrc দিয়ে পুনরায় লোড করুন

তারপরে শেষ কমান্ডটি ভুলে যেতে 'ভুলে যান' টাইপ করুন: ডি। শেষ 3 টি কমান্ড ভুলে গিয়ে 'ভুলে যান 3' টাইপ করুন। কিছু সেক্সি শিজ্জায়।

উপরের তীর টিপুন আপনাকে সরাসরি শেষ কমান্ডে নিয়ে যাবে এবং 'ভুলে যান' শব্দটি মনে রাখবে না :) :)

আপডেট হয়েছে: হোম পাথ যুক্ত হয়েছে , সুতরাং এটি এখন সমস্ত ডিরেক্টরিতে কাজ করে ol

আপডেট 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

সুতরাং আমরা স্পেস বার টিপতে পারি এবং টাইপ করতে পারি 'ইকো হাই', এন্টার টিপুন এবং যখন আমরা উপরের তীর টিপুন তখন 'ইকো হাই' আমাদের ইতিহাসে নেই)।

আমার_রেমোভ_স্তর_ইস্ত্রি_তন্ত্রের আগে কীভাবে উপন্যাস 'ভুলে যান' তার একটি স্থান রয়েছে তা লক্ষ্য করুন। এটি এমনটি যাতে zsh ইতিহাসে আমাদের 'ভুলে যাওয়া' সংরক্ষণ করে না।

ফাংশন ব্যাখ্যা

জেডএসএইচ ইতিহাস বা অন্য কিছুর জন্য এফসি ব্যবহার করে, তাই আমরা আমাদের বর্তমান কমান্ডগুলি ইতিহাসের ফাইলে লেখার জন্য 'এফসি-ডাব্লু' করি, সেগুলি আমরা ফাইলের শেষ কমান্ডটি ছাঁটাইতে 'হেড-এন -1' ব্যবহার করি। আমরা সেই আউটপুটটিকে একটি অস্থায়ী ফাইলে সংরক্ষণ করি এবং তারপরে অস্থায়ী ফাইলের সাথে মূল ইতিহাস ফাইলটি প্রতিস্থাপন করি। এবং পরিশেষে fc -R দিয়ে ইতিহাস পুনরায় লোড করুন।

ফাংশনটিতে সমস্যা আছে যা ওরফে দিয়ে স্থির করা হয়েছে।

যদি আমরা এর নামে এই ফাংশনটি চালাই তবে এটি সর্বশেষ আদেশটি সরিয়ে ফেলবে, যা ফাংশনে কল the এই কারণেই আমরা একটি স্থান ব্যবহার করে এটির সাথে ডাকের সাথে উপনামটি ব্যবহার করি, যাতে zsh ইতিহাস ফাইলে এই ফাংশনটির নামটি যুক্ত না করে, আমরা যা চাই তার শেষ প্রবেশটি তৈরি করে: ডি।


যদি শেষ কমান্ডটি বহু-লাইন হত?
এভিপি

এটি সরকারী উত্তর হিসাবে ভোট দেওয়া উচিত। ধন্যবাদ।
জিএসএল

1

ইন zsh, histignorespaceবিকল্পটি সেট করুন ( set -o histignorespace)। আর এ bashযোগ, ignorespaceবা ignoreboth(কিছু ডিস্ট্রিবিউশন ইতিমধ্যে ডিফল্ট না ~/.bashrcকরার জন্য) $HISTCONTROLবা সেট HISTIGNORE=' *', এবং তারপরে আপনি শুরু করতে পারেন বর্তমান একটি কমান্ড <স্পেস> এটা রেকর্ডিং এড়ানো।

:
 : none
fc -nl -1

:

ইন zsh, আপনি এখনও আগের কমান্ডটি একবারে স্মরণ করতে পারেন তবে এটি ইতিহাসে সঞ্চিত নয়।


এটি প্রশ্নের সমাধান করে না।
ক্রিস পেজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.