বেস ইতিহাসে কেবলমাত্র সফল কমান্ড রাখুন


20

কখনও কখনও আমি একটি কমান্ডের বাক্য গঠনকে ভুল বুঝি:

# mysql -d test
mysql: unknown option '-d'
# echo $?
2

আমি আবার চেষ্টা করে ঠিক করে নিলাম:

# mysql --database test
Welcome to the MySQL monitor.
mysql >
...

ইতিহাসে প্রবেশের জন্য আমি কীভাবে 0 এর চেয়ে পৃথক ত্রুটি কোড সহ প্রথম কমান্ডটি আটকাব?

উত্তর:


20

আমি মনে করি না আপনি সত্যিই এটি চান। আমার স্বাভাবিক কর্মপ্রবাহ এইভাবে চলে:

  • একটি কমান্ড টাইপ করুন
  • চালাও এটা
  • এটি ব্যর্থ লক্ষ্য করুন
  • ইউপি কী টিপুন
  • কমান্ডটি সম্পাদনা করুন
  • আবার চালাও

এখন, যদি ব্যর্থ কমান্ডটি ইতিহাসে সংরক্ষণ না করা হয় তবে আমি এটি আবার ঠিক করতে এবং চালানোর জন্য সহজেই ফিরে পেতে পারি না।


3
আমার ধারণা, আরও ভাল নকশাটি একটি সেশন ইতিহাস এবং একটি স্থায়ী ইতিহাস হবে। ধন্যবাদ!
আদম মাতান

আপনি টার্মিনাল থেকে প্রস্থান করার পরে ইতিহাস সংরক্ষণ করা হবে। সুতরাং আপনি যখন এই টার্মিনাল সেশনে টাইপ করেছেন সেই কমান্ডগুলিতে ফিরে যেতে পারেন এটি টার্মিনালটি থেকে বেরিয়ে আসার পরে বাশ ইতিহাসে সংরক্ষিত হয়।
কি

11

আমি এটি করতে কেবল ভাবতে পারি এটি ব্যবহার history -dকরা $PROMPT_COMMAND। এটি বা যে কোনও পদ্ধতির সমস্যাটি হ'ল এটি বলা অসম্ভব যে কোনও কমান্ড কোনও ত্রুটির সাথে প্রস্থান করেছে বা একটি শূন্য-বহির্গমন কোড সহ সফলভাবে সম্পূর্ণ হয়েছে কিনা।

$ grep non_existent_string from_file_that_exists
$ echo $?
1

4

এটি সংশোধন করার জন্য সর্বশেষ ভুল মন্তব্য করা ভাল তবে এটির খুব শীঘ্রই এটি সম্ভাব্য বিভ্রান্ত আবর্জনায় পরিণত হয়।

আমার পদ্ধতির দ্বি-পদক্ষেপ: স্টোর কমান্ডগুলি যখন তারা ব্যর্থ হয় এবং কিছুক্ষণ পরে সেগুলি সরিয়ে দেয়।

স্টোর কমান্ডগুলি যখন তারা ব্যর্থ হয়:

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_handlerEXIT, কিন্তু আপনি এটা যে কোনো সময় আগে কল করতে পারেন।

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