এটি সংশোধন করার জন্য সর্বশেষ ভুল মন্তব্য করা ভাল তবে এটির খুব শীঘ্রই এটি সম্ভাব্য বিভ্রান্ত আবর্জনায় পরিণত হয়।
আমার পদ্ধতির দ্বি-পদক্ষেপ: স্টোর কমান্ডগুলি যখন তারা ব্যর্থ হয় এবং কিছুক্ষণ পরে সেগুলি সরিয়ে দেয়।
স্টোর কমান্ডগুলি যখন তারা ব্যর্থ হয়:
error_handler() {
FAILED_COMMANDS="$(history | tail -1l | cut -c -5) $FAILED_COMMANDS"
}
trap error_handler ERR
trap command signals
এর command
মধ্যে signals
একটি "উত্থাপিত" হয় কার্যকর করে।
$(command)
এক্সিকিউট করে command
এবং এর আউটপুট ক্যাপচার করে।
কমান্ড ব্যর্থ হলে, কোডটির এই স্নিপেট ইতিহাসে সংরক্ষণ করা সর্বশেষ কমান্ডের ইতিহাস সংখ্যাটি ক্যাপচার করে এবং ভবিষ্যতে মুছে ফেলার জন্য এটি পরিবর্তনশীলে সঞ্চয় করে।
সরল, তবে HISTCONTROL
এবং এর সাথে ভুলভাবে কাজ করে HISTIGNORE
- যখন কোনও একটি ভেরিয়েবলের কারণে কমান্ড ইতিহাসে সংরক্ষণ করা হয় না, ইতিহাসে সংরক্ষণ করা শেষ কমান্ডের ইতিহাস সংখ্যাটি পূর্ববর্তী কমান্ডের একটি; সুতরাং, যদি ভুল কমান্ডটি ইতিহাসে সংরক্ষণ না করা হয়, তবে পূর্ববর্তী আদেশটি মুছে ফেলা হবে।
সামান্য আরও জটিল সংস্করণ, যা সেই ক্ষেত্রে সঠিকভাবে কাজ করে:
debug_handler() {
LAST_COMMAND=$BASH_COMMAND;
}
error_handler() {
local LAST_HISTORY_ENTRY=$(history | tail -1l)
# if last command is in history (HISTCONTROL, HISTIGNORE)...
if [ "$LAST_COMMAND" == "$(cut -d ' ' -f 2- <<< $LAST_HISTORY_ENTRY)" ]
then
# ...prepend it's history number into FAILED_COMMANDS,
# marking the command for deletion.
FAILED_COMMANDS="$(cut -d ' ' -f 1 <<< $LAST_HISTORY_ENTRY) $FAILED_COMMANDS"
fi
}
trap error_handler ERR
trap debug_handler DEBUG
পরে সংরক্ষণ করা কমান্ডগুলি সরিয়ে ফেলুন:
exit_handler() {
for i in $(echo $FAILED_COMMANDS | tr ' ' '\n' | uniq)
do
history -d $i
done
FAILED_COMMANDS=
}
trap exit_handler EXIT
ব্যাখ্যা:
বাশ থেকে বেরিয়ে আসার সময়, প্রতিটি অনন্য ইতিহাসের সংখ্যার সাথে সম্পর্কিত ইতিহাসের এন্ট্রি সরিয়ে ফেলুন,
তারপরে FAILED_COMMANDS
ইতিমধ্যে মুছে ফেলা কমান্ডগুলি থেকে ইতিহাস নম্বর উত্তরাধিকার সূত্রে প্রাপ্ত আদেশগুলি সরিয়ে না ফেলতে পরিষ্কার করুন ।
যদি আপনি নিশ্চিত হন যে এটি FAILED_COMMANDS
সদৃশ থেকে মুক্ত হবে, তবে আপনি এটির মাধ্যমে সরল পুনরাবৃত্তি করতে পারেন
(অর্থাত্ লিখন for i in $FAILED_COMMANDS
)। তবে, আশা এটি (এই ক্ষেত্রে এটা সবসময় হয়) সর্বশ্রেষ্ঠ থেকে ক্ষুদ্রতম সাজানো না, প্রতিস্থাপন uniq
সঙ্গে sort -rnu
।
ইতিহাসের সংখ্যাগুলি FAILED_COMMANDS
অবশ্যই অনন্য এবং সবচেয়ে বড় থেকে ছোট পর্যন্ত বাছাই করতে হবে, কারণ আপনি যখন প্রবেশের কাজটি মুছবেন তখন পরবর্তী কমান্ডের নম্বরগুলি স্থানান্তরিত হবে - যেমন। যখন আপনি ইস্যু করেন history -d 2
, তৃতীয় এন্ট্রি দ্বিতীয় হয়, চতুর্থ তৃতীয় হয়, ইত্যাদি etc.
এজন্য , এই কোডটি ব্যবহার করার সময়, আপনি ম্যানুয়ালি কল করতে পারবেন না history -d <n>
যেখানে n
সঞ্চিত বৃহত্তম সংখ্যার চেয়ে ছোট বা সমানFAILED_COMMANDS
সেখানে কোডটি সঠিকভাবে কাজ করার আশা করতে পারে expect
এটা সম্ভবত হুক ভাল ধারণা exit_handler
এ EXIT
, কিন্তু আপনি এটা যে কোনো সময় আগে কল করতে পারেন।