একাধিক টার্মিনাল উইন্ডোতে বাশ ইতিহাস সংরক্ষণ করুন


526

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

আমি একটি ইতিহাস চাই যে:

  • প্রতিটি টার্মিনাল থেকে সমস্ত কিছু মনে রাখে
  • প্রতিটি টার্মিনাল থেকে তাত্ক্ষণিকভাবে অ্যাক্সেসযোগ্য (যেমন আমি lsযদি একটিতে থাকি তবে ইতিমধ্যে অন্য একটি চলমান টার্মিনালে স্যুইচ করুন এবং তারপরে টিপুন, আপ lsপ্রদর্শন করুন)
  • কমান্ডের সম্মুখভাগে ফাঁকা স্থান থাকলে কমান্ডটি ভুলে যায় না।

বাশ কাজকে এরকম করে তুলতে আমি যা কিছু করতে পারি?


57
আমি এর সুবিধা দেখতে পাচ্ছি, তবে ব্যক্তিগতভাবে আমি এটি আমার শেলটিতে ঘৃণা করব। আমি সাধারণত আমার টার্মিনালে খুব নির্দিষ্ট ব্যবহারের জন্য 3 বা 4 টি ট্যাব খোলা রাখি: 'মেক' চালানোর জন্য একটি, ভিআই সহ একটি, স্টাফ চালানোর জন্য ইত্যাদি। তাই আমি যখন সংকলন করি তখন আমি ট্যাব 1 এ যাই, হিট আপ এবং 'মেক' করি 'উঠে আসে, ইত্যাদি। এটি আমার কাছে অত্যন্ত ফলদায়ক। সুতরাং হঠাৎ যদি আমি আমার 'মেক' ট্যাবে গিয়ে হিট আপ করি এবং কিছু এলোমেলো গ্রেপ কমান্ড প্রদর্শিত হয়, আমি সত্যিই খুব মিস হয়ে যাব! যদিও একটি ব্যক্তিগত নোট
axel_c

4
@axel_c এটি যথেষ্ট সত্য। আমি এটি করার কোনও বুদ্ধিমান উপায়ের কথা ভাবতে পারি না যেখানে বিদ্যমান টার্মিনালগুলি কেবল তাদের নিজস্ব ইতিহাস দেখায় তবে নতুনরা কমান্ডের কালানুক্রমিকভাবে সঠিক তালিকা দেখতে পারে।
অলি

8
@ অলি লিখেছিলেন, "আমি এটি করার কোনও বুদ্ধিমান উপায়ের কথা ভাবতে পারি না যেখানে বিদ্যমান টার্মিনালগুলি কেবল তাদের নিজস্ব ইতিহাস দেখায় তবে নতুনরা কমান্ডের কালানুক্রমিকভাবে সঠিক তালিকা দেখতে পায়।" কেমন হয় (অপরীক্ষিত): export PROMPT_COMMAND="history -a; $PROMPT_COMMAND"। বিদ্যমান শেলগুলি নতুন শেলগুলি দেখার জন্য ইতিহাসের ফাইলটিতে প্রতিটি কমান্ড যুক্ত করবে, তবে কেবল তাদের নিজস্ব ইতিহাস প্রদর্শন করবে।
ক্রিস পৃষ্ঠা

2
আপনি কি ইতিহাসটি আলাদাভাবে সঞ্চিত বা সমস্ত একক ইতিহাসের ফাইলে একত্রিত করতে চান?
Kbyrd

3
সংক্ষিপ্ত উত্তর: এটি ব্যাশ বিকাশকারীদের দ্বারা উদ্দিষ্ট নয়। ইতিহাস পুনরায় পাঠের পরে ফ্লাশিংয়ের ভিত্তিতে সমাধানগুলি সম্ভবত কাজ করে তবে শ্লেমিল দ্য পেইন্টার থেকে সাবধান থাকুন । সোজা কথায়: প্রতিটি কমান্ডের মধ্যে প্রক্রিয়াজাতকরণের পরিমাণ ইতিহাসের আকারের সাথে সমানুপাতিক।
স্টাফেন গরিখন

উত্তর:


329

নিম্নলিখিতগুলি ~ / .bashrc এ যুক্ত করুন

# Avoid duplicates
export HISTCONTROL=ignoredups:erasedups  
# When the shell exits, append to the history file instead of overwriting it
shopt -s histappend

# After each command, append to the history file and reread it
export PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"

20
এই PROMPT_COMMAND সমাধানের সাথে সমস্যাটি হ'ল প্রতিটি কমান্ডের পরে প্রতিটি ইতিহাস আইটেমের জন্য নম্বরগুলি পরিবর্তিত হয় :( উদাহরণস্বরূপ আপনি যদি ইতিহাস এবং 1) ls 2) rm টাইপ করেন তবে 1 টি পুনরাবৃত্তি করতে 1 করুন, ইতিহাসের নম্বরটি পরিবর্তন হতে পারে এবং rm কমান্ড চালাতে পারে ...
ক্রিস কিম্পটন

2
যখন আমি এই কাজ, অন্যান্য ইতিমধ্যে খুলুন টার্মিনাল যখন আমি প্রেস 'আপ' পর পর্যন্ত আমি একটি কমান্ড গত প্রবেশ কমান্ড হবে না যে টার্মিনাল - এই বলে আশা করা হচ্ছে? যদি তা হয় তবে অন্য টার্মিনালের ইতিহাস তাত্ক্ষণিকভাবে সংশোধন করার কোনও উপায় আছে কি?
সান

7
@ সুন, কমান্ডের উপর ভিত্তি করে এটি আমার কাছে সঠিক বলে মনে হচ্ছে। আমি দেখতে পেয়েছি যে ইতিহাসটি আপডেট করার জন্য আমরা একটি নাল কমান্ড (কেবলমাত্র কী টিপুন) টিপতে পারি।
ঋষি

3
প্রকৃতপক্ষে history -a(...) বাশ ইতিহাসের এই প্রশ্নের উত্তর অনুসারে ডুপ্লিকেটগুলি মুছে ফেলতে ট্রিগার করে না : "উপেক্ষা" এবং "মুছে ফেলা" সেশনের জুড়ে সাধারণ ইতিহাসের সাথে দ্বন্দ্ব স্থাপন করে । এই উত্তরটি history -<option>কমান্ডগুলির ক্রমও দেয় যা HISTCONTROL=ignoredups:erasedupsসেটিংয়ের সাথে কাজ করে।
পাইটর ডব্রোগোস্ট

23
সেখানে কোনো কারণ নেই এবং ভেরিয়েবল: আপনি তাদের মধ্যে সংজ্ঞায়িত করা হয় যাতে তারা যে শেল (অ-ইন্টারেক্টিভ বেশী এমনকি, যা অযথা হয়) সংজ্ঞায়িত করা হবে না। exportHISTCONTROLPROMPT_COMMAND.bashrc
ডোলম্যান

248

সুতরাং, এটি আমার ইতিহাস সম্পর্কিত সমস্ত .bashrcবিষয়:

export HISTCONTROL=ignoredups:erasedups  # no duplicate entries
export HISTSIZE=100000                   # big big history
export HISTFILESIZE=100000               # big big history
shopt -s histappend                      # append to history, don't overwrite it

# Save and reload the history after each command finishes
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

ম্যাক ওএস এক্স 10.5-তে বাশ 3.2.17, 10.6-এ 4.1.7 বাশ দিয়ে পরীক্ষিত।


3
হুম .. এটি কমান্ড সংখ্যা প্রতিটি প্রম্পট পরিবর্তন করার সাথে সাথে use! 34 ব্যবহারের সক্ষমতা নষ্ট করে দেয়। @ ডেভিড @ স্কোফ @ কেচ?

5
অসীম ইতিহাস পেতে এটি ব্যবহার করুন: চিরন্তন ইতিহাস বশ করুন । যাইহোক, এটি উপরের কোডটির প্রশংসামূলক, কারণ এটি স্বয়ংক্রিয়ভাবে পুনরায় লোড হবে না।

7
এফওয়াইআই এখানে বর্ণিত সমাধানগুলির মধ্যে কোনওটিই নিম্নলিখিত সমস্যার সমাধান করতে পারে না। শেল উইন্ডো A এ আমার দুটি শেল উইন্ডো A এবং B. রয়েছে, আমি চালাচ্ছি sleep 9999এবং শেল উইন্ডো B তে (ঘুমের অপেক্ষার অপেক্ষা না করে) বি, আমি sleep 9999বাশ ইতিহাসে দেখতে সক্ষম হতে চাই ।
পিটিএস

1
@ পিটিএস আমিও লাইভ আচরণের লক্ষ্যে ছিলাম, কিন্তু তখন আমি বুঝতে পেরেছিলাম যে টার্মিনাল নির্দিষ্ট ইতিহাস রয়েছে যা বিভিন্ন টার্মিনালগুলিতে বিভিন্ন জিনিসে কাজ করা আরও সহজ করে তোলে more আমি এটি খুব দরকারী বলে মনে করেছি: স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 82২৮৮৫৫ /# answer-7449399 তার ভিত্তিতে, আমি নিজেকে নিজেকে এমন একটি উপাধি বানিয়েছি hrefযা আমার বর্তমান টার্মিনালের ইতিহাস তাত্ক্ষণিকভাবে রিফ্রেশ করে এবং প্রক্রিয়াটিতে ইতিহাস ফাইলটি সাফ করে। আমি যখনই নতুন টার্মিনালটি খুলি, তখন আমার বাশার্ক ফাইলটিতে সেই ক্লিনআপ / সিঙ্কটি কার্যকর করা হয় তাই নতুন টার্মিনালের সর্বশেষ ইতিহাস রয়েছে। আমি এটি পাশাপাশি ব্যবহার করছিhistory -a
trusktr

6
exportভেরিয়েবলগুলির কোনও কারণ নেই : আপনি এগুলি সংজ্ঞায়িত করছেন .bashrcযাতে তারা প্রতিটি শেলের মধ্যে সংজ্ঞায়িত হবে (এমনকি অ-ইন্টারেক্টিভগুলিতেও এটি ব্যর্থ)
ডলম্যান

118

বাশ সেশনের ইতিহাস ভাগ করে নেওয়ার জন্য আমার চেষ্টা এখানে। এটি বাশ সেশনের মধ্যে ইতিহাস ভাগ করা এমনভাবে সক্ষম করবে যাতে ইতিহাসের কাউন্টারটি মিশ্রিত না হয় এবং ইতিহাসের সম্প্রসারণ যেমন !numberকাজ করবে (কিছু সীমাবদ্ধতার সাথে)।

উবুন্টু 10.04 এলটিএস (লুসিড লিংকস) এর অধীনে বাশ সংস্করণ 4.1.5 ব্যবহার করা।

HISTSIZE=9000
HISTFILESIZE=$HISTSIZE
HISTCONTROL=ignorespace:ignoredups

_bash_history_sync() {
    builtin history -a         #1
    HISTFILESIZE=$HISTSIZE     #2
    builtin history -c         #3
    builtin history -r         #4
}

history() {                  #5
    _bash_history_sync
    builtin history "$@"
}

PROMPT_COMMAND=_bash_history_sync

ব্যাখ্যা:

  1. সুনির্দিষ্ট প্রবেশ করা লাইনটি $HISTFILEডিফল্ট হিসাবে যুক্ত করুন .bash_history। এটি $HISTFILEএক লাইনে বৃদ্ধি পাবে।

  2. বিশেষ ভেরিয়েবলকে $HISTFILESIZEকিছু মূল্যে সেট করা বাশকে সবচেয়ে পুরানো এন্ট্রিগুলি সরিয়ে লাইনগুলির $HISTFILEচেয়ে আর $HISTFILESIZEছাঁটাই করবে।

  3. চলমান সেশনের ইতিহাস সাফ করুন। এটি পরিমাণের দ্বারা ইতিহাসের কাউন্টারকে হ্রাস করবে $HISTSIZE

  4. এর সামগ্রীগুলি পড়ুন $HISTFILEএবং সেগুলি বর্তমান চলমান সেশন ইতিহাসে সন্নিবেশ করান। এটি লাইনের পরিমাণের সাহায্যে ইতিহাসের কাউন্টারকে বাড়িয়ে তুলবে $HISTFILE। নোট করুন যে লাইন গণনা $HISTFILEঅগত্যা নয় $HISTFILESIZE

  5. history()ফাংশন builtin ইতিহাস নিশ্চিত করুন যে ইতিহাস আগেই প্রদর্শন করা হয় সিঙ্ক্রোনাইজ করা আছে করতে ওভাররাইড করে। সংখ্যা দ্বারা ইতিহাস বিস্তারের জন্য এটি পরে প্রয়োজনীয় (এটি আরও পরে)।

আরও ব্যাখ্যা:

  • পদক্ষেপ 1 নিশ্চিত করে যে চলমান চলমান সেশন থেকে কমান্ডটি বিশ্ব ইতিহাসের ফাইলে লেখা রয়েছে।

  • ৪ র্থ পদক্ষেপটি নিশ্চিত করে যে অন্যান্য সেশনের আদেশগুলি বর্তমান সেশনের ইতিহাসে পড়ে।

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

  • ৩ য় ধাপে ইতিহাসের কাউন্টারটি হ্রাস পেয়েছে $HISTSIZE। চতুর্থ ধাপে ইতিহাসের কাউন্টারটি লাইন সংখ্যা দ্বারা উত্থাপিত হয় $HISTFILE। দ্বিতীয় ধাপে আমরা নিশ্চিত হয়েছি যে রেখার গণনা $HISTFILEহুবহু $HISTSIZE(এর অর্থ এটি $HISTFILESIZEঅবশ্যই একই হবে $HISTSIZE)।

ইতিহাস বিস্তারের সীমাবদ্ধতা সম্পর্কে:

সংখ্যা দ্বারা ইতিহাস সম্প্রসারণ ব্যবহার করার সময়, আপনি উচিত সবসময় আপ সংখ্যা চেহারা অবিলম্বে এটি ব্যবহার করার পূর্বে। এর অর্থ সংখ্যাটি অনুসন্ধান করা এবং এটি ব্যবহারের মধ্যে কোনও বাশ প্রম্পট প্রদর্শন নয়। এর অর্থ সাধারণত কোন প্রবেশ এবং কোনও সিটিআরএল + সি নয়।

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

আমি এই সীমাবদ্ধতা যুক্তিসঙ্গত মনে করি। আমাকে যেকোন সময় প্রতি নম্বর দেখতে হবে কারণ আমি স্বেচ্ছাচারিত ইতিহাসের নম্বরগুলি মনে করতে পারি না।

সাধারণত আমি ইতিহাসের সম্প্রসারণটি এর মতো সংখ্যায় ব্যবহার করি

$ history | grep something #note number
$ !number

আমি নিম্নলিখিত বাশ বিকল্প ব্যবহার করার পরামর্শ দিচ্ছি।

## reedit a history substitution line if it failed
shopt -s histreedit
## edit a recalled history line before executing
shopt -s histverify

অদ্ভুত বাগ:

ইতিহাসের আদেশটি যেকোনো কিছুতে পাইপ দেওয়া হলে সেই আদেশটি ইতিহাসে দু'বার তালিকাভুক্ত হবে। উদাহরণ স্বরূপ:

$ history | head
$ history | tail
$ history | grep foo
$ history | true
$ history | false

সমস্ত ইতিহাসে দুবার তালিকাভুক্ত হবে। কেন আমি জানি না।

উন্নতির জন্য ধারণা:

  • ফাংশনটি পরিবর্তন করুন _bash_history_sync()যাতে এটি প্রতিবার কার্যকর হয় না। উদাহরণস্বরূপ এটি CTRL+Cপ্রম্পটে একটি এর পরে কার্যকর করা উচিত নয় । আমি প্রায়শই CTRL+Cএকটি দীর্ঘ কমান্ড লাইন ফেলে দেওয়ার জন্য ব্যবহার করি যখন আমি সিদ্ধান্ত নিই যে আমি line লাইনটি কার্যকর করতে চাই না। কখনও কখনও আমাকে CTRL+Cব্যাশ সমাপ্তির স্ক্রিপ্ট বন্ধ করতে ব্যবহার করতে হয়।

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


1
কেন "ইতিহাস-এন" (পুনরায় লোড করা লাইনগুলি ইতিমধ্যে লোড করা হয়নি) "ইতিহাস-সি; ইতিহাস-আর" এর পরিবর্তে নয়?
গ্রাহাম

@ গ্রাহাম: আমি ব্যবহার করতে চাইনি history -nকারণ এটি ইতিহাসের কাউন্টারকে গণ্ডগোল করে । এছাড়াও, আমি history -nখুব বিশ্বাসযোগ্য না বলে মনে করি।
লেসমানা

1
একটি অসুবিধা: মাল্টি-লাইন স্ট্রিং সহ কমান্ডগুলি সাধারণত বর্তমান সেশনে সংরক্ষণ করা হয়। এই কৌশল দ্বারা, তারা তাত্ক্ষণিকভাবে পৃথক লাইনে বিভক্ত হয়। -N -c -r এর জন্য -n ব্যবহার করা কোনও উপকারে আসে না, সেমিথডিস্ট বা লিথিস্টও দেয় না। আমি মনে করি না যে এই মুহুর্তে একটি কাজ আছে।
জো লিস

24
কিছুটা চেষ্টা করার পরে, আমি আসলে দেখতে পেয়েছি যে কেবল চালানোই এবং history -aছাড়া , আরও ভাল ব্যবহারযোগ্যতা-ভিত্তিক (যদিও এটি প্রশ্নটি জিজ্ঞাসা করেছিল তা নয়)। এর অর্থ হ'ল আপনি চালিত কমান্ডগুলি বর্তমান শেলটি প্রস্থান করার আগেই নতুন শেলগুলিতে তাত্ক্ষণিকভাবে উপলব্ধ but এইভাবে অ্যারো-আপ এখনও সর্বদা চলতি সেশনের শেষ-রান আদেশগুলি নির্বাচন করে , যা আমি অনেক কম বিভ্রান্তিকর বলে মনে করি। -c-r
জো লিস

অসম্ভব ভালো উত্তর, এটি সাধারণভাবে "ইতিহাস -a; ইতিহাস -n" এর বিপরীতে নির্ভরযোগ্যভাবে কাজ করে
রিচভেল

42

আমি কোনওভাবেই ব্যবহার সম্পর্কে সচেতন নই bash। তবে এটি এর অন্যতম জনপ্রিয় বৈশিষ্ট্য zsh
ব্যক্তিগতভাবে আমি এর zshচেয়ে বেশি পছন্দ করি bashতাই এটি চেষ্টা করার পরামর্শ দিই।

.zshrcইতিহাসের সাথে আমার অংশটি এখানে রয়েছে :

SAVEHIST=10000 # Number of entries
HISTSIZE=10000
HISTFILE=~/.zsh/history # File
setopt APPEND_HISTORY # Don't erase history
setopt EXTENDED_HISTORY # Add additional data to history like timestamp
setopt INC_APPEND_HISTORY # Add immediately
setopt HIST_FIND_NO_DUPS # Don't show duplicates in search
setopt HIST_IGNORE_SPACE # Don't preserve spaces. You may want to turn it off
setopt NO_HIST_BEEP # Don't beep
setopt SHARE_HISTORY # Share history between session/terminals


16

এটি করতে, আপনাকে আপনার দুটি লাইন যুক্ত করতে হবে ~/.bashrc:

shopt -s histappend
PROMPT_COMMAND="history -a;history -c;history -r;$PROMPT_COMMAND"

থেকে man bash:

যদি হিস্টপেন্ড শেল বিকল্পটি সক্ষম করা থাকে (নীচে শেল বিল্টিন কম্যান্ডের অধীনে শপটের বিবরণ দেখুন), লাইনগুলি ইতিহাসের ফাইলে সংযুক্ত করা হয়, অন্যথায় ইতিহাসের ফাইলটি অতিরিক্ত লিখিত থাকে।


10

মুরার যে "ইতিহাস -a" এবং "ইতিহাস -আর" চালানোর জন্য আপনার বেস প্রম্পটটি সম্পাদনা করতে পারেন:

savePS1=$PS1

(আপনি যদি কিছু গণ্ডগোল করেন তবে এটি প্রায় নিশ্চিত)

PS1=$savePS1`history -a;history -r`

(নোট করুন যে এগুলি ব্যাক-টিক্স; তারা প্রতিটি প্রম্পটে ইতিহাস -a এবং ইতিহাস চালাবে Since যেহেতু তারা কোনও পাঠ্য আউটপুট দেয় না, তাই আপনার প্রম্পটটি অপরিবর্তিত হবে।

আপনার PS1 ভেরিয়েবলটি আপনি যেভাবে চান সেট আপ হয়ে গেলে, এটি আপনার ~ / .bashrc ফাইলে স্থায়ীভাবে সেট করুন।

আপনি যদি পরীক্ষার সময় আপনার মূল প্রম্পটে ফিরে যেতে চান তবে করুন:

PS1=$savePS1

এটি যাতে কাজ করে তা নিশ্চিত করার জন্য আমি এর উপর বেসিক টেস্টিং করেছি, তবে history -a;history -rপ্রতিটি প্রম্পটে চালানো থেকে কোনও পার্শ্ব প্রতিক্রিয়া বলতে পারে না ।


2
kch এর সমাধান আমার চেয়ে ভাল কাজ করে। আমি এখন আমার .bashrc এ তার সমাধানটি ব্যবহার করছি।

9

আপনার যদি কোনও বাশ বা জেডশ ইতিহাসের সিঙ্ক্রোনাইজিং সমাধানের প্রয়োজন হয় যা নীচের সমস্যাটিও সমাধান করে, তবে এটি http://ptspts.blogspot.com/2011/03/how-to-automatic-synchronize-shell.html এ দেখুন

সমস্যাটি হ'ল: আমার দুটি শেল উইন্ডোজ এ এবং বি রয়েছে শেল উইন্ডো এ, আমি চালাচ্ছি sleep 9999এবং শেল উইন্ডো বিতে ঘুমের অপেক্ষায় না রেখে আমি sleep 9999বাশ ইতিহাসে দেখতে সক্ষম হতে চাই ।

এখানে অন্যান্য বেশিরভাগ সমাধানগুলি এই সমস্যার সমাধান না করার কারণ হ'ল তারা হিস্ট্রি ফাইলটিতে তাদের ইতিহাসের পরিবর্তনগুলি ব্যবহার করে লিখছেন PROMPT_COMMANDবা PS1, উভয়ই sleep 9999কমান্ড শেষ হওয়ার পরে খুব দেরী করে কার্যকর করছেন ।


1
এটি একটি দুর্দান্ত সমাধান, তবে আমি কয়েকটি প্রশ্ন পেয়েছি। ১. আমি কি আসল .bash_history ফাইলটি ব্যবহার করতে পারি, আমি আমার $ হোম 2 তে অন্য কোনও বাশ ইতিহাস ফাইলের অস্তিত্ব চাই না be.আপনি এটির জন্য একটি গিথুব রেপো সেট করা বিবেচনা করতে পারেন।
weynhamz

দেখে মনে হচ্ছে ডিবাগ হুক বাশদ্বির সাথে দ্বন্দ্বযুক্ত, প্রতিবার আমি ব্যাশ সেশন শুরু করার পরে অনুসরণ করা ফলাফল। deb `` ব্যাশ ডিবাগার, বাশদ্বি, রিলিজ 4.2-0.8 কপিরাইট 2002, 2003, 2004, 2006, 2007, ২০০৮, ২০০৯, ২০১০, ২০১১ রকি বার্নস্টেইন এটি জিএনইউ জেনারেল পাবলিক লাইসেন্স দ্বারা আচ্ছাদিত একটি মুক্ত সফ্টওয়্যার, এবং আপনাকে স্বাগতম এটি পরিবর্তন করুন এবং / অথবা নির্দিষ্ট শর্তে এর অনুলিপি বিতরণ করুন। ** অভ্যন্তরীণ ডিবাগ ত্রুটি _ডিবজি_আইস_ফিল (): ফাইল আর্গুমেন্ট নাল বাশ: _ডিবজি_ফাইলেমনস [$ পূর্ণ নাম]: খারাপ অ্যারে সাবস্ক্রিপ্ট
we

@ টেকলাইভ ঝেং: ১. আসল .Bash_history ইচ্ছাকৃতভাবে সমর্থিত নয়, কারণ। নিমজ্জিত_বাশ_ইস্টরি একটি ভিন্ন ফাইল ফর্ম্যাট ব্যবহার করে, তাই। নিমজ্জিত_ব্যাশ_ইস্টরি সঠিকভাবে লোড করতে ব্যর্থ হলে, বাশ দুর্ঘটনাক্রমে জমা হওয়া ইতিহাসকে আঁকড়ে ধরবে না। নকশার দ্বারা দৃ Rob়তা, যেমন রাখা হবে। ২. গিথুব রেপো সাধারণভাবে একটি ভাল ধারণা, তবে এই প্রকল্পের জন্য এটি রক্ষণ করার আমার কাছে সময় নেই, তাই আমি এটি করছি না। - হ্যাঁ, এটি বাশদ্বির সাথে সাংঘর্ষিক এবং এর কোনও সহজ সমাধান নেই (তারা একই হুক ব্যবহার করে)। আমি কোনও ফিক্সে কাজ করার পরিকল্পনা করছি না, তবে আমি প্যাচগুলি গ্রহণ করছি।
pts

ঠিক আছে ধন্যবাদ. আমি অনেক সহজ এবং ভাল sulotion নিয়ে এসেছি।
weynhamz

@ টেকলাইভহেং: আপনি কি আমাদের সহজ এবং ভাল সমাধানটি আমাদের সাথে ভাগ করে নিতে পারেন, তাই আমরা সকলেই এ থেকে শিখতে পারি? (যদি তা হয় তবে দয়া করে প্রশ্নের উত্তর যুক্ত করুন))
pts

8

আপনি history -aবর্তমান সেশনের ইতিহাসকে হিস্টফাইলে সংযুক্ত করতে ব্যবহার করতে পারেন , তারপরে history -rহিস্টফিলটি পড়ার জন্য অন্যান্য টার্মিনালগুলিতে ব্যবহার করুন। 


8

ঠিক আছে, সুতরাং অবশেষে এটি একটি শালীন সমাধান খুঁজতে আমাকে বিরক্ত করেছিল:

# Write history after each command
_bash_history_append() {
    builtin history -a
}
PROMPT_COMMAND="_bash_history_append; $PROMPT_COMMAND"

এটি যা করে তা হ'ল এই থ্রেডে যা বলা হয়েছিল তার সংশ্লেষের ধরণ, এ ছাড়া আমি বুঝতে পারি না যে আপনি কেন প্রতিটি আদেশের পরে বৈশ্বিক ইতিহাস পুনরায় লোড করবেন। আমি অন্যান্য টার্মিনালগুলিতে কী ঘটে সে সম্পর্কে খুব কমই যত্নশীল, তবে আমি সবসময় কমান্ডের ধারাবাহিকতা চালাই, এক টার্মিনালে বলে:

make
ls -lh target/*.foo
scp target/artifact.foo vm:~/

(সরলীকৃত উদাহরণ)

এবং অন্যটিতে:

pv ~/test.data | nc vm:5000 >> output
less output
mv output output.backup1

কোনওভাবেই আমি কমান্ডটি ভাগ করে নেওয়া চাই না


1
প্রতিটি কমান্ডের পরে আপনি ইতিহাসটি পুনরায় লোড করার কারণটি হ'ল এটিই প্রশ্নের দ্বারা প্রয়োজনীয় আচরণ (এবং সুতরাং এটি আসলে উত্থাপিত হিসাবে প্রশ্নের উত্তর দেয় না)।
মাইকেল হোমার

2
@ মিশেলহোমর ফেয়ার পয়েন্ট নিচে নির্দ্বিধায় বোধ করুন যাতে উত্তরটি নীচে থাকে, তবে, আমি অনুরোধ করা আচরণটি কতটা খারাপ হবে তা বুঝতে না পেরে ওপিকে এটিকে চক করব, এবং এটি খুব গুগলযোগ্য প্রশ্ন।
ইয়ারেক টি

3
হ্যাঁ, এটি একটি সুস্পষ্ট সমঝোতা Op আমার মূল অভিযোগটি হ'ল আমি ইতিহাস হারাচ্ছিলাম। এটি একই সাথে বন্ধ হওয়া উচিত, এমনকি যদি এটি একইসাথে অধিবেশন জুড়ে তাত্ক্ষণিক আপডেটের অর্থ না হয়।
অলি

7

এখানে আমি ব্যবহার করি এমন একটি বিকল্প। এটি জটিল, তবে এটি এই সমস্যার সমাধান করে যা @axel_c উল্লেখ করেছে যেখানে কখনও কখনও আপনি প্রতিটি টার্মিনালে আলাদা ইতিহাসের উদাহরণ রাখতে চান (মেকিংয়ের জন্য একটি, মনিটরিংয়ের জন্য একটি, ভিমের জন্য একটি ইত্যাদি)।

আমি একটি পৃথক সংযুক্ত ইতিহাসের ফাইল রাখি যা আমি নিয়মিত আপডেট করি। আমি নীচে একটি হটকি ম্যাপ করেছি:

history | grep -v history >> ~/master_history.txt

এটি আপনার ঘরের ডিরের মাস্টার_ইস্টরি.txt নামে একটি ফাইলের সাথে বর্তমান ইতিহাসের সমস্ত ইতিহাস সংযুক্ত করে।

মাস্টার ইতিহাসের ফাইলটি অনুসন্ধান করার জন্য আমার একটি আলাদা হটকিও রয়েছে:

cat /home/toby/master_history.txt | grep -i

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

আপনি that মাস আগে যে ট্র্যাবিক রেজেক্সটি ব্যবহার করেছেন বা যে অদ্ভুত পার্ল ওয়ান-লাইনার নিয়ে এসেছিলেন তা দ্রুত অনুসন্ধান এবং সন্ধান করতে সক্ষম হওয়াই সর্বদা দুর্দান্ত।


6

আমি শেষেরটির জন্য একটি স্থির প্রস্তাব দিতে পারি: নিশ্চিত করুন যে এনভের ভেরিয়েবল এইচআইএসটি কনট্রোল "অবহেলা স্পেস" (বা "উপেক্ষা করা") নির্দিষ্ট করে না।

তবে আমি একাধিক সমবর্তী সেশনগুলির সাথে আপনার ব্যথা অনুভব করছি। এটি কেবল ব্যাশে ভালভাবে পরিচালনা করা হয় না।


6

@ লেসমানার উত্তরে আমার বর্ধন এখানে । মূল পার্থক্য হ'ল সমবর্তী উইন্ডোগুলি ইতিহাস ভাগ করে না। এর অর্থ আপনি আপনার উইন্ডোতে অন্য উইন্ডোগুলির প্রসঙ্গ না রেখে আপনার বর্তমান উইন্ডোতে লোড হয়ে যাওয়া চালিয়ে যেতে পারেন।

আপনি যদি স্পষ্টভাবে 'ইতিহাস' টাইপ করেন, বা আপনি যদি একটি নতুন উইন্ডো খোলেন তবে আপনি পূর্ববর্তী সমস্ত উইন্ডো থেকে ইতিহাস পাবেন।

এছাড়াও, আমি এই কৌশলটি আমার মেশিনে টাইপ করা প্রতিটি কমান্ড আর্কাইভ করতে ব্যবহার করি ।

# Consistent and forever bash history
HISTSIZE=100000
HISTFILESIZE=$HISTSIZE
HISTCONTROL=ignorespace:ignoredups

_bash_history_sync() {
  builtin history -a         #1
  HISTFILESIZE=$HISTSIZE     #2
}

_bash_history_sync_and_reload() {
  builtin history -a         #1
  HISTFILESIZE=$HISTSIZE     #2
  builtin history -c         #3
  builtin history -r         #4
}

history() {                  #5
  _bash_history_sync_and_reload
  builtin history "$@"
}

export HISTTIMEFORMAT="%y/%m/%d %H:%M:%S   "
PROMPT_COMMAND='history 1 >> ${HOME}/.bash_eternal_history'
PROMPT_COMMAND=_bash_history_sync;$PROMPT_COMMAND

5

আমি প্রতি ফাইল-প্রতি টাইমে ইতিহাস স্থাপন করা বেছে নিয়েছি, কারণ একাধিক লোক একই সার্ভারে কাজ করতে পারে - প্রতিটি সেশনের কমান্ড পৃথক করে নিরীক্ষণ করা আরও সহজ করে তোলে।

# Convert /dev/nnn/X or /dev/nnnX to "nnnX"
HISTSUFFIX=`tty | sed 's/\///g;s/^dev//g'`
# History file is now .bash_history_pts0
HISTFILE=".bash_history_$HISTSUFFIX"
HISTTIMEFORMAT="%y-%m-%d %H:%M:%S "
HISTCONTROL=ignoredups:ignorespace
shopt -s histappend
HISTSIZE=1000
HISTFILESIZE=5000

ইতিহাস এখন দেখে মনে হচ্ছে:

user@host:~# test 123
user@host:~# test 5451
user@host:~# history
1  15-08-11 10:09:58 test 123
2  15-08-11 10:10:00 test 5451
3  15-08-11 10:10:02 history

ফাইলগুলি দেখতে দেখতে:

user@host:~# ls -la .bash*
-rw------- 1 root root  4275 Aug 11 09:42 .bash_history_pts0
-rw------- 1 root root    75 Aug 11 09:49 .bash_history_pts1
-rw-r--r-- 1 root root  3120 Aug 11 10:09 .bashrc

3

এখানে আমি একটি সমস্যা চিহ্নিত করব

export PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"

এবং

PROMPT_COMMAND="$PROMPT_COMMAND;history -a; history -n"

আপনি যদি সোর্স ~ / .bashrc চালান তবে $ PROMPT_COMMAND এর মতো হবে

"history -a; history -c; history -r history -a; history -c; history -r"

এবং

"history -a; history -n history -a; history -n"

প্রতিবার 'উত্স ~ / .bashrc' চালানোর সময় এই পুনরাবৃত্তি ঘটে। প্রতিবার 'ইকো $ PROMPT_COMMAND' চালিয়ে আপনি 'উত্স ~ / .bashrc' চালানোর পরে আপনি PROMPT_COMMAND চেক করতে পারেন।

আপনি দেখতে পাচ্ছেন কিছু কমান্ড আপাতদৃষ্টিতে নষ্ট হয়ে গেছে: "ইতিহাস-ইতিহাসের ইতিহাস"। তবে সুসংবাদটি হ'ল এটি এখনও কার্যকর হয়, কারণ অন্যান্য অংশগুলি এখনও একটি বৈধ কমান্ড সিকোয়েন্স তৈরি করে (কিছু আদেশ পুনরাবৃত্তভাবে কার্যকর করার কারণে কিছু অতিরিক্ত ব্যয় জড়িত And এবং এত পরিষ্কার নয়))

ব্যক্তিগতভাবে আমি নিম্নলিখিত সহজ সংস্করণটি ব্যবহার করি:

shopt -s histappend
PROMPT_COMMAND="history -a; history -c; history -r"

যার বেশিরভাগ কার্যকারিতা রয়েছে যখন উপরে উল্লিখিত তেমন কোনও সমস্যা নেই।

আরেকটি বিষয় তৈরি করতে হবে: জাদুতে আসলে কিছুই নেই । PROMPT_COMMAND হ'ল একটি সরল বাশ পরিবেশ পরিবর্তনশীল। আপনি বাশ প্রম্পট পাওয়ার আগে এতে থাকা কমান্ডগুলি কার্যকর করা হবে ($ চিহ্ন)। উদাহরণস্বরূপ, আপনার PROMPT_COMMAND হ'ল "প্রতিধ্বনি 123", এবং আপনি আপনার টার্মিনালে "ls" চালান। প্রভাবটি "এলএস; ইকো 123" চলার মতো।

$ PROMPT_COMMAND="echo 123"

আউটপুট ('PROMPT_COMMAND = "প্রতিধ্বনি 123" চালানোর মতো; T_ PROMPT_COMMAND'):

123

নিম্নলিখিত চালান:

$ echo 3

আউটপুট:

3
123

"ইতিহাস -a" মেমোরিতে ইতিহাস কমান্ডগুলি ~ / .bash_history এ লিখতে ব্যবহৃত হয়

"ইতিহাস -c" মেমোরিতে ইতিহাসের আদেশগুলি সাফ করতে ব্যবহৃত হয়

"ইতিহাস -r" commands / .Bash_History থেকে মেমরির ইতিহাস কমান্ডগুলি পড়তে ব্যবহৃত হয়

ইতিহাস কমান্ডের ব্যাখ্যাটি এখানে দেখুন: http://ss64.com/bash/history.html

পিএস: অন্যান্য ব্যবহারকারীরা যেমন উল্লেখ করেছেন, রফতানি অপ্রয়োজনীয়। দেখুন: .bashrc এ রফতানি ব্যবহার করে


2

আমি প্রতি সেশনে একটি ইতিহাস ফাইল সেট করার জন্য একটি স্ক্রিপ্ট লিখেছি বা এটি নীচে থেকে ভিত্তি করে টাস্ক করেছি।

        # write existing history to the old file
        history -a

        # set new historyfile
        export HISTFILE="$1"
        export HISET=$1

        # touch the new file to make sure it exists
        touch $HISTFILE
        # load new history file
        history -r $HISTFILE

এটি প্রতিটি ইতিহাসের কমান্ডটি সংরক্ষণ করার প্রয়োজন হয় না তবে এটি যেটির জন্য আমি যত্ন করি সেগুলি সংরক্ষণ করে এবং সেগুলি পুনরুদ্ধার করা সহজ এবং তারপরে প্রতিটি কমান্ডের মধ্য দিয়ে যায়। আমার সংস্করণ সমস্ত ইতিহাস ফাইলগুলি তালিকাভুক্ত করে এবং সেগুলির মাধ্যমে অনুসন্ধান করার ক্ষমতা সরবরাহ করে।

সম্পূর্ণ উত্স: https://github.com/simotek/scriptts-config/blob/master/hiset.sh


2

এখানে একটি সমাধান রয়েছে যা পৃথক সেশন থেকে ইতিহাস মিশ্রিত করে না !

মূলত একজনকে প্রতিটি সেশনের ইতিহাস আলাদাভাবে সঞ্চয় করতে হয় এবং প্রতিটি প্রম্পটে তা পুনরায় তৈরি করতে হয়। হ্যাঁ, এটি আরও সংস্থানগুলি ব্যবহার করে, তবে এটি যতটা শোনাচ্ছে তত ধীর নয় - আপনার যদি 100000 এর বেশি ইতিহাস প্রবেশ রয়েছে তবেই বিলম্ব লক্ষণীয় হতে শুরু করে be

মূল যুক্তি এখানে:

# on every prompt, save new history to dedicated file and recreate full history
# by reading all files, always keeping history from current session on top.
update_history () {
  history -a ${HISTFILE}.$$
  history -c
  history -r
  for f in `ls ${HISTFILE}.[0-9]* | grep -v "${HISTFILE}.$$\$"`; do
    history -r $f
  done
  history -r "${HISTFILE}.$$"
}
export PROMPT_COMMAND='update_history'

# merge session history into main history file on bash exit
merge_session_history () {
  cat ${HISTFILE}.$$ >> $HISTFILE
  rm ${HISTFILE}.$$
}
trap merge_session_history EXIT

কিছু সুরক্ষিত কর্মক্ষমতা এবং পারফরম্যান্স অপ্টিমাইজেশন সহ পুরো সমাধানের জন্য এই সূচনাটি দেখুন ।


1

এটি ZSH এর জন্য কাজ করে

##############################################################################
# History Configuration for ZSH
##############################################################################
HISTSIZE=10000               #How many lines of history to keep in memory
HISTFILE=~/.zsh_history     #Where to save history to disk
SAVEHIST=10000               #Number of history entries to save to disk
#HISTDUP=erase               #Erase duplicates in the history file
setopt    appendhistory     #Append history to the history file (no overwriting)
setopt    sharehistory      #Share history across terminals
setopt    incappendhistory  #Immediately append to the history file, not just when a term is killed

দুর্ভাগ্যক্রমে প্রশ্নটি কঠোরভাবে
বশ

1
গুগলে এটির প্রথম ফলাফল যখন আমি জেডএস-এর পাশাপাশি অনুসন্ধান করলাম ... ভেবেছিলাম এটি সাহায্য করতে পারে
মুলকি

3
আপনার একটি নতুন প্রশ্ন জিজ্ঞাসা করা উচিত, multiple "একাধিক টার্মিনাল উইন্ডোতে zsh ইতিহাস সংরক্ষণ করুন", ধরে নিই যে এটি ইতিমধ্যে বিদ্যমান নেই। এটি সম্পূর্ণরূপে ঠিক আছে - উত্সাহিত your আপনার নিজের প্রশ্নের উত্তর দিতে যদি উত্সাহিত হয় তবে এটি একটি ভাল প্রশ্ন।
অলি

1

আমি দীর্ঘকাল এটি চেয়েছিলাম, বিশেষত একটি নতুন প্রকল্পে পুনরায় সম্পাদন করার জন্য (বা কমান্ড দ্বারা একটি ডিরেক্টরি সন্ধান করার জন্য) চালিত কোন আদেশটি পুনরুদ্ধার করার ক্ষমতা। সুতরাং আমি এই সরঞ্জামটি একসাথে রেখেছি , যা পারকোল (সি-আর-তে ম্যাপযুক্ত) নামক একটি ইন্টারেক্টিভ গ্রেপিং সরঞ্জামের সাথে বিশ্বব্যাপী সিএলআইয়ের ইতিহাস সংরক্ষণের জন্য পূর্ববর্তী সমাধানগুলিকে একত্রিত করে। এটি এখনও>> 2 বছরের পুরানো সিএলআই ইতিহাসের সাথে এটি ব্যবহার শুরু করা প্রথম মেশিনে এখনও চটজলদি।

যতক্ষণ না তীর কীগুলি সম্পর্কিত এটি স্থানীয় সিএলআই ইতিহাসের সাথে বিঘ্নিত হয় না, তবে আপনাকে বৈশ্বিক ইতিহাসকে সহজেই অ্যাক্সেস করতে দেয় (যা আপনি সি ^ আর ব্যতীত অন্য কোনওটিতে মানচিত্রও বানাতে পারেন)


এই zsh জন্য?
sjas

1
হ্যাঁ, আমি এটি প্রথম দিকে zsh এর জন্য তৈরি করেছিলাম। যদিও এটি বাশ এবং মাছের জন্য কাজ করছে। এটি কাজ করে কিনা তা আমাকে জানান। আমি কিছুক্ষণের মধ্যে এটি পরিবর্তন করিনি এবং আমি নিশ্চিত হয়েছি যে আমি আমার ইনস্টল নির্দেশাবলীতে কতটা পরিষ্কার হয়েছি
গর্ডন ওয়েলস

1

কারণ আমি অসীম ইতিহাসকে পছন্দ করি যা কাস্টম ফাইলে সংরক্ষণ করা হয়েছে। আমি https://stackoverflow.com/a/19533853/4632019 এর উপর ভিত্তি করে এই কনফিগারেশনটি তৈরি করেছি :

export HISTFILESIZE=
export HISTSIZE=
export HISTTIMEFORMAT="[%F %T] "

export HISTFILE=~/.bash_myhistory
PROMPT_COMMAND="history -a; history -r; $PROMPT_COMMAND"

-1

এখানে আমার .বাশার্ক থেকে স্নিপেট এবং যেখানে প্রয়োজন সেখানে সংক্ষিপ্ত বিবরণ দেওয়া হল:

# The following line ensures that history logs screen commands as well
shopt -s histappend

# This line makes the history file to be rewritten and reread at each bash prompt
PROMPT_COMMAND="$PROMPT_COMMAND;history -a; history -n"
# Have lots of history
HISTSIZE=100000         # remember the last 100000 commands
HISTFILESIZE=100000     # start truncating commands after 100000 lines
HISTCONTROL=ignoreboth  # ignoreboth is shorthand for ignorespace and     ignoredups

হিস্টফিলিজ এবং হিস্টিজ হ'ল ব্যক্তিগত পছন্দসই এবং আপনি আপনার পছন্দ অনুসারে এগুলি পরিবর্তন করতে পারেন।

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