একটি টার্মিনাল থেকে প্রস্থান করার সময় অন্যান্য টার্মিনালগুলিতে বাশ ইতিহাস আপডেট করুন


15

আমি জানি যে এই প্রশ্নটি অস্পষ্ট নয়, কারণ এখানে বলা হয় আপডেট চালিয়ে যান (এবং এখানে নকল )।

আমি যা অর্জন করার চেষ্টা করছি তা কিছুটা আলাদা। আমার প্রম্পটটি প্রতি lsটাইপ করা প্রতিটি ফাইল ( history -a; history -c; history -r) লিখার ধারণাটি আমি পছন্দ করি না ।

আমি প্রস্থান করার সময় ফাইলটি আপডেট করতে চাই। এটি সহজ (আসলে, ডিফল্ট), তবে আপনাকে পুনরায় লেখার পরিবর্তে সংযোজন করতে হবে:

shopt -s histappend

এখন, যখন কোনও টার্মিনালটি বন্ধ হয়ে যায়, আমি আপডেটটি সম্পর্কে সচেতন থাকার জন্য অন্য সকলকে উন্মুক্ত থাকতে চাই।

আমি টাইপ $PS1করা প্রতিটি পরীক্ষা করেই এটি করা পছন্দ commandকরি। আমি মনে করি যে কোনও ধরণের সংকেত ক্যাপচার করা ভাল। আপনি এটা কিভাবে করবেন? যদি সম্ভব না হয়, সম্ভবত একটি সহজ cronjob?

কীভাবে আমরা এই ধাঁধাটি সমাধান করতে পারি?


1
নোট করুন যে zsh বাক্সের বাইরে এটি করে (এবং ইতিহাস ভাগ করে নেওয়ার জন্য অনেক বিকল্প রয়েছে)।
গিলস 'খারাপ হয়ে যাওয়া বন্ধ করুন'

ধন্যবাদ @ গিলস; মজার বিষয়, লিনাক্স ব্যবহার করার বছরগুলি এবং আমি ছাড়া আর কিছুই চেষ্টা করিনি bash। হতে পারে সময়টি নতুন কিছু যাচাই করার জন্য, কেবল মজাদার জন্য।
ডাঃ বেকো

উত্তর:


15

আপনি কি সৃজনশীল এবং জড়িত সংকেতগুলি বলছেন? ঠিক আছে:

trap on_exit EXIT
trap on_usr1 USR1

on_exit() {
    history -a
    trap '' USR1
    killall -u "$USER" -USR1 bash
}

on_usr1() {
    history -n
}

Uckোকাও .bashrcএবং যাও। এটি অন্য bashপ্রক্রিয়াটি যখন প্রস্থান করে তখন নতুন ইতিহাসের এন্ট্রিগুলি পরীক্ষা করার জন্য প্রতিটি প্রক্রিয়াটি বলতে সংকেত ব্যবহার করে । এটি বেশ ভয়াবহ, তবে এটি সত্যই কার্যকর।


এটা কিভাবে কাজ করে?

trapসিস্টেম সিগন্যাল বা বাশের কোনও অভ্যন্তরীণ ইভেন্টের জন্য সিগন্যাল হ্যান্ডলার সেট করে। EXITঘটনা, যখন শেল কোন নিয়ন্ত্রিত পরিসমাপ্তি হয় USR1হয় SIGUSR1, একটি অর্থহীন সংকেত আমরা যথার্থ করার করছি।

যখনই শেলটি প্রস্থান করে, আমরা:

  • সমস্ত ইতিহাস স্পষ্টতই ফাইলটিতে যুক্ত করুন।
  • SIGUSR1হ্যান্ডলারটি অক্ষম করুন এবং এই শেলটি সিগন্যালটিকে উপেক্ষা করুন।
  • bashএকই ব্যবহারকারীর সমস্ত চলমান প্রক্রিয়াতে সংকেত প্রেরণ করুন ।

যখন একটি SIGUSR1আসে, আমরা:

  • ইতিহাসের ফাইল থেকে সমস্ত নতুন এন্ট্রি শেলের মেমোরি ইতিহাস তালিকায় লোড করুন।

বাশ যেভাবে সংকেতগুলি পরিচালনা করে, আপনি Enterপরবর্তী বার আঘাত না করা পর্যন্ত আপনি আসলে নতুন ইতিহাসের ডেটা পাবেন না , সুতরাং এটি সম্মুখের history -nদিকে রাখার চেয়ে আর ভাল কিছু করতে পারে না PROMPT_COMMAND। যদিও কিছুই ঘটেনি ততক্ষণ এই ফাইলটি অবিচ্ছিন্নভাবে সংরক্ষণ করা যায় এবং শেলটি বের না হওয়া অবধি কোনও লেখা নেই।


এখনও এখানে বেশ কয়েকটি ইস্যু রয়েছে। প্রথমটি হ'ল ডিফল্ট প্রতিক্রিয়া SIGUSR1হ'ল শেলটি সমাপ্ত করা । অন্য কোনও bashপ্রক্রিয়া (উদাহরণস্বরূপ শেল স্ক্রিপ্টগুলি চালানো) মারা যাবে। .bashrcঅ-ইন্টারেক্টিভ শেল দ্বারা লোড করা হয় না। পরিবর্তে, নামের একটি ফাইল BASH_ENVলোড করা হয়েছে : আপনি বিশ্বব্যাপী আপনার পরিবেশে সেই পরিবর্তনশীলটি একটি ফাইলের সাথে নির্দেশ করতে পারেন:

trap '' USR1

এতে তাদের মধ্যে সংকেত উপেক্ষা করার জন্য (যা সমস্যার সমাধান করে)।

সবশেষে, যদিও আপনি যা চেয়েছিলেন এটি তা করে, আপনি যে ক্রমটি অর্ডার করেছেন সেটি কিছুটা অস্বাভাবিক হবে। বিশেষত, ইতিহাসের বিটগুলি লোড হওয়া এবং আলাদাভাবে সংরক্ষণ করার কারণে বিভিন্ন ক্রমে পুনরাবৃত্তি হবে। এটি যা আপনি চাইছেন তা মূলত অন্তর্নিহিত, তবে সচেতন থাকবেন যে আপ-তীরের ইতিহাসটি এই মুহুর্তে অনেক কম দরকারী হয়ে ওঠে। যদিও ইতিহাসের বিকল্পগুলি এবং এর মতো ভাগ করা হবে এবং ভালভাবে কাজ করবে।


আমি অবাক হয়েছি আপনি যদি .bashrcফাইলটির মধ্যে সময় মুদ্রাঙ্কন সক্ষম করে রেখেছিলেন এবং তারপরে ক্রোনজবের মতো কিছু এসেছিল এবং SIGUSR1আপনার সময়ে স্নিপেট অনুসারে একটি বার্তা প্রেরণ করে , আপনি কালানুক্রমিক আপ-তীর ইতিহাসটি ফিরে পেতে পারেন কিনা?
বজায় রাখুন

এটি একটি ঝরঝরে সমাধান তবে সত্য হিসাবে অন্যান্য প্রক্রিয়াগুলি ইউএসআর 1 এর সাথে সমাপ্ত হয়। এই আচরণটি কি ইউএসআর 2 এর সাথেও ঘটে?
ডাঃ বেকো

আমি দ্বিতীয় মন্তব্য যুক্ত করব, কারণ আমি অবাক হয়েছি। প্রক্রিয়াটি ইউএসআর 1 এর সাথে টিআরএমকে কীভাবে যুক্ত করবে? ইউএসআর 1 কি কেবল ব্যবহারকারী দ্বারা ব্যবহার করার মতো কিছু নয় ?? এটা কি কিছু linux bug?? অন্যান্য প্রক্রিয়া কেন ইউএসআর 1 ধরছে? (আমি জানি যে এটি এখানে আলোচনা করা নয়, তবে সম্ভবত আমি এটি সঠিক জায়গায় প্রকাশ করব)
ডঃ বেকো

প্রায় সব সংকেতের ডিফল্ট আচরণ হ'ল সমাপ্তি; এটি পসিক্সে নির্দিষ্ট করা আছে । এটি কোনও বাগ নয়। বাশ আপনাকে নির্দিষ্ট করতে দেবে যে সিগন্যালটি তার সমস্ত প্রক্রিয়ার জন্য অগ্রাহ্য করা হবে, যদিও এটি আমাদের উদ্দেশ্যগুলির পক্ষে ঠিক।
মাইকেল হোমার

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