বাশ ইতিহাস: "উপেক্ষা" এবং "মুছে ফেলা" সেশন জুড়ে সাধারণ ইতিহাসের সাথে দ্বন্দ্ব স্থাপন করে


84

প্রথমত, এটি এসইতে বিদ্যমান কোনও থ্রেডের সদৃশ নয়। আমি উন্নত বাশ ইতিহাসে এই দুটি থ্রেড ( 1 ম , 2 য় ) পড়েছি , তবে উত্তরগুলির কোনওটিই কাজ করে না - - আমি পথে ফেডোরা 15 এ আছি।

আমি .bashrcব্যবহারকারী ডিরেক্টরিতে (/ home / aahan /) ফাইলটিতে নিম্নলিখিতগুলি যুক্ত করেছি এবং এটি কার্যকর হয় না। কারও কি কোনও ক্লু আছে?

HISTCONTROL=ignoredups:erasedups  # no duplicate entries
HISTSIZE=1000                     # custom history size
HISTFILESIZE=100000                 # custom history file size
shopt -s histappend                      # append to history, don't overwrite it
PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"  # Save and reload the history after each command finishes

ঠিক আছে আমি বাশ ইতিহাস (অগ্রাধিকার) এর সাথে এটি চাই:

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

আচমকা! যে কেউ? কিছুই কাজ করে না। ফেডোরা 15 (জিনোম 3 এবং উইন্ডোজ হোস্ট ভার্চুয়াল মেশিনে চলছে) এর সাথে সমস্যা হতে পারে?
এর_আমি

অনুগ্রহ করে এখানে পোস্টগুলি "টুকরো টুকরো" করবেন না। যদি তারা উত্তর না পেয়ে থাকে তবে আপনাকে আরও স্পষ্ট করে জিজ্ঞাসা করতে হবে, প্রসঙ্গের সূত্রের ডান বিট বা কোনও কিছু অন্তর্ভুক্ত করুন। যদি আপনার পোস্টগুলিতে মনোযোগের প্রয়োজন হয় তবে আপনি এমন উদ্যানগুলি জারি করতে পারেন যা আরও বেশি লোককে আরও বেশি মনোযোগ দেওয়ার ক্ষেত্রে সহায়তা করে।
কালেব

1
আপনি কি নিশ্চিত যে ব্যাশ ব্যবহার করছেন? ( echo $SHELL)। আপনি যদি ওপেন শেল থেকে ম্যানুয়ালি চালনা করেন তবে সেটিংস কী কাজ করে? স্পষ্টতই যেহেতু তারা অন্য অনেকের জন্য কাজ করে সেটিংসটি সঠিক, আপনি কেবল তাদের ভুল প্রয়োগ করছেন। এবং কোনও ফেডোরা 15 / জিনোম 3 / ভার্চুয়াল মেশিন হওয়ার সাথে এর আসল কার্যকারিতাটির সাথে সামান্যই সম্পর্ক রয়েছে bash
কালেব

@ কালেব, পোস্টটি ধাক্কা দেওয়ার বিষয়ে প্রথমে দুঃখিত এছাড়াও, আমি আমার সাধ্যমতো চেষ্টা করেছি খুব পরিষ্কার হয়েছি। না, আমি সেগুলি শেলের মধ্যে জারি করি নি। আমি এগুলি কেবল .bashrcফাইল -এ অনুলিপি করেছি । এটা কি ভুল? প্রকৃত শেল কমান্ডের সাহায্যে আপনি কি এই পোস্টে একটি "উত্তর" যুক্ত করতে পারেন? (দয়া করে আমার নুব-আইটি সহ্য করুন))
এর_ম

1
আপনি স্ক্রিপ্টগুলিতে বা .bashrcহ'ল প্রকৃত শেল কমান্ডগুলিতে যা কিছু লেখেন । স্ক্রিপ্টগুলি শেল কমান্ডের কেবল সিরিজ। এছাড়াও আপনি সম্প্রতি সম্পাদনাটি exportবিটটি সরিয়ে ফেলা একটি খারাপ ধারণা ছিল, এটি রাখা উচিত।
কালেব

উত্তর:


119

এটি আসলেই একটি আকর্ষণীয় আচরণ এবং আমি স্বীকার করি যে আমি প্রথমদিকে প্রশ্নটিকে খুব কম মূল্যায়ন করেছি। তবে প্রথমে তথ্যগুলি:

1. কি কাজ করে

কার্যকারিতা বিভিন্ন উপায়ে অর্জন করা যায়, যদিও প্রত্যেকে কিছুটা ভিন্নভাবে কাজ করে। মনে রাখবেন যে, প্রতিটি ক্ষেত্রে ইতিহাসকে অন্য একটি টার্মিনালে "স্থানান্তরিত" করতে (আপডেট হওয়া), একজনকে Enterটার্মিনালে চাপতে হবে , যেখানে তিনি ইতিহাস পুনরুদ্ধার করতে চান।

  • বিকল্প 1:

    shopt -s histappend
    HISTCONTROL=ignoredups
    PROMPT_COMMAND="history -a; history -n; $PROMPT_COMMAND"

    এর দুটি ঘাটতি রয়েছে:

    1. লগইন (টার্মিনাল খোলার) সময়, ইতিহাসের ফাইল থেকে শেষ কমান্ডটি বর্তমান টার্মিনালের ইতিহাসের বাফারে দুবার পড়বে;
    2. বিভিন্ন টার্মিনালের বাফারগুলি ইতিহাসের ফাইলের সাথে সুসংগত থাকে না।
  • বিকল্প 2:

    HISTCONTROL=ignoredups
    PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

    (হ্যাঁ, প্রয়োজন নেই shopt -s histappendএবং হ্যাঁ, এটির মাঝখানে থাকতে হবে ) এই সংস্করণটির দুটি গুরুত্বপূর্ণ ত্রুটি রয়েছে:history -cPROMPT_COMMAND

    1. ইতিহাস ফাইলটি শুরু করতে হবে। এটিতে কমপক্ষে একটি খালি খালি লাইন থাকতে হবে (যে কোনও কিছু হতে পারে)।
    2. historyকমান্ড মিথ্যা আউটপুট দিতে পারে - নিচে দেখুন।

[সম্পাদনা] "এবং বিজয়ী হলেন ..."

  • বিকল্প 3:

    HISTCONTROL=ignoredups:erasedups
    shopt -s histappend
    PROMPT_COMMAND="history -n; history -w; history -c; history -r; $PROMPT_COMMAND"

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


২. বিকল্প 2 কাজ করে বলে মনে হচ্ছে না (বা: আসলে কী প্রত্যাশার সাথে কাজ করে না)?

যেমনটি আমি উল্লেখ করেছি, উপরের প্রতিটি সমাধান আলাদাভাবে কাজ করে। কিন্তু কিভাবে সেটিংস কাজ অধিকাংশ বিভ্রান্তিকর ব্যাখ্যা আউটপুট বিশ্লেষণ থেকে আসে historyকমান্ড । অনেক ক্ষেত্রে, কমান্ডটি ভুল আউটপুট দিতে পারে। কেন? কারণ এটি অন্তর্ভুক্ত অন্যান্য কমান্ডের ক্রম আগে নির্বাহ historyকরা হয় PROMPT_COMMAND! তবে, দ্বিতীয় বা তৃতীয় বিকল্পটি ব্যবহার করার সময়, কেউ .bash_historyসামগ্রীর পরিবর্তনগুলি ( watch -n1 "tail -n20 .bash_history"উদাহরণস্বরূপ ব্যবহার করে ) পর্যবেক্ষণ করতে পারবেন এবং আসল ইতিহাসটি কী তা দেখুন।

৩. বিকল্প 3 এত জটিল কেন ?

এটি সব erasedupsকাজ করে। যেমন বাশ ম্যানুয়ালটিতে বলা হয়েছে, "(...) এর সাথে erasedupsপূর্ববর্তী সমস্ত রেখাগুলির সাথে মিলিয়ে সেই লাইনটি সংরক্ষণের আগে ইতিহাসের তালিকা থেকে সরানো হবে" । সুতরাং ওপি সত্যই এটি চেয়েছিল (এবং কেবল আগে নয়, যেমনটি আমি আগে ভেবেছিলাম, অনুক্রমে কোনও সদৃশ উপস্থিত না হয় ) । কেন প্রতিটি history -.কমান্ডের হয় বা না থাকতে পারে তা এখানে PROMPT_COMMAND:

  • history -n হয়েছে সেখানে হতে সামনে history -wথেকে পড়তে .bash_historyকমান্ড অন্য কোন টার্মিনাল থেকে রক্ষা

  • history -w হয়েছে অনুক্রমে ফাইল করুন এবং সদৃশ নিশ্চিহ্ন ইতিহাস সঞ্চয় সেখানে হতে,

  • history -a এর পরিবর্তে অবশ্যই সেখানে স্থাপন করা উচিত নয়history -w , কারণ এটি সদৃশগুলি মুছে ফেলার চেষ্টা করে না,

  • history -cএটি প্রয়োজনও কারণ এটি প্রতিটি আদেশের পরে হিস্ট্রি বাফার ট্র্যাশ করতে বাধা দেয়,

  • এবং শেষ পর্যন্ত, ফাইল থেকে ইতিহাসের বাফারটি পুনরুদ্ধার history -rকরা দরকার , এভাবে শেষ পর্যন্ত ইতিহাসকে টার্মিনাল সেশনে ভাগ করে নেওয়া।


2
+1 এর জন্য "তবে ইতিহাস কমান্ডের আউটপুট বিশ্লেষণ করে সেটিংস কীভাবে কাজ করে তার সবচেয়ে বিভ্রান্তিকর ব্যাখ্যা interpretation" আমি মনে করি এটিই ওপি'র ইস্যুটির মূল বিষয়। দুর্দান্ত ছাড়
জেসনওয়ারিয়ান

2
আমি অবশেষে আপনার বক্তব্য দেখেছি। 'সদৃশ' দ্বারা আপনি আমার চেয়ে অন্য কিছু বোঝাতে চেয়েছিলেন। আমি কেবল একই কমান্ডের ক্রমগুলিতে মনোনিবেশ করেছি । আমার উত্তর আপডেট করেছে - "বিকল্প 3" দেখুন। এছাড়াও, আপনার ক্ষেত্রে, ইতিহাসটি কীভাবে কাজ করে তা পরীক্ষা করার জন্য আসলে এর watch "tail -n 20 .bash_history"পরিবর্তে আপনার ব্যবহার করা উচিত tail -f .bash_history
rozcietrzewiacz

2
বিকল্প 3 সবেমাত্র আমার 100,000 ইতিহাসের সমস্ত লাইন মুছে ফেলেছে :( (বাশ 3.2.25 (1) -প্রকাশ)
ফিলিপ আলভারেজ

2
history -cএটিও প্রয়োজন কারণ এটি প্রতিটি আদেশের পরে হিস্ট্রি বাফার ট্র্যাশ করা আটকাচ্ছে কেন এই ট্র্যাসিং ঘটে?
পাইটর ডব্রোগস্ট

2
আপনার সমাধান 3 আসলে কাজ করে না। এটি অত্যন্ত বাগিচা এবং ব্যবহারকারীরা বিভিন্ন টার্মিনালগুলিতে প্রবেশ করার আদেশের উপর নির্ভর করে। এটি প্রায়শই হারিয়ে যাওয়া কমান্ডগুলির ফলস্বরূপ, বিশেষত টার্মিনালের মধ্যে পিছনে পিছনে স্যুইচ করার সময়। সূত্র: এটি চেষ্টা করে দেখুন।
6cef

8

আপনার প্রম্পট কমান্ডে, আপনি -cস্যুইচটি ব্যবহার করছেন । থেকে man bash:

-c   সমস্ত এন্ট্রি মুছে দিয়ে ইতিহাসের তালিকা সাফ করুন

সমস্ত খোলার টার্মিনালের সাথে আপনার ইতিহাস ভাগ করতে, আপনি ব্যবহার করতে পারেন -n:

-n   ইতিহাস ফাইলগুলি ইতিমধ্যে ইতিহাস ফাইল থেকে বর্তমান ইতিহাস তালিকায় না পড়ুন lines এগুলি বর্তমান বাশ সেশনের শুরু থেকেই ইতিহাসের ফাইলে যুক্ত লাইনগুলি lines

ডিফল্ট আকারটি ম্যানুয়ালটিতেও রয়েছে:

হিস্টিজ করুন কমান্ডের ইতিহাসে কমান্ডের সংখ্যা মনে রাখার জন্য (নীচে ইতিহাস দেখুন)। ডিফল্ট মান 500 হয়।

মাল্টি-লাইন কমান্ডগুলি সংরক্ষণ করতে:

Cmdhist শেল বিকল্প, যদি সক্রিয় থাকে, সেমিকোলন যেখানে প্রয়োজন অন্বিত শুদ্ধি সংরক্ষণে যোগ একই ইতিহাস এন্ট্রিতে একটি মাল্টি-লাইন কমান্ডের প্রতিটি লাইনে সংরক্ষণ করার প্রচেষ্টা শেল ঘটায়। Lithist শেল বিকল্প সেমিকোলন পরিবর্তে এমবেডেড নতুন লাইন দিয়ে কমান্ড সেভ করতে শেল ঘটায়।

এছাড়াও, আপনার এইচআইএসটি * কমান্ডগুলি প্রিফেস করা উচিত নয় export- এগুলি কেবল পরিবেশ-পরিবর্তনশীল নয়, কেবল ব্যাশ-ভেরিয়েবল: HISTCONTROL=ignoredups:erasedupsযথেষ্ট।


সুতরাং, export PROMPT_COMMAND="history -a; history -n; history -r; $PROMPT_COMMAND"এটা সঠিক? এছাড়াও, আপনি কি জানেন যে আমি কীভাবে ইতিহাস ফাইল স্টোরটিকে মাল্টি-লাইন কমান্ডগুলি একক কমান্ড হিসাবে তৈরি করতে পারি (যা পূর্বনির্ধারিতভাবে বন্ধ) ??
এর_আমি

1
হ্যাঁ. উপরে উদ্ধৃত ম্যান পৃষ্ঠা অনুসারে, shopt -s cmdhistবহু-লাইনগুলি সংরক্ষণ করবে।
জেসনওয়ারিয়ান

ঠিক আছে, আমি সব চেষ্টা করেছিলাম। দেখে মনে হচ্ছে HISTCONTROL=ignoredups:erasedupsকাজ করছে না। আমি .bashrcফাইলটিতে এটির চেষ্টা করেছি (কাস্টম ফাংশনগুলির মধ্যে)। ভুল হতে পারে কি কোন ধারণা? আমি ভার্চুয়াল মেশিনে ফেডোরা 15 ব্যবহার করছি - - উইন্ডোজ 7 হোস্ট।
এর_আমি

নিশ্চিত অন্যান্য প্রারম্ভকালে ফাইল, মত কিছুই নেই করুন /etc/bashrc, .bash_profileইত্যাদি হয় যে অগ্রাহ্য।
জেসনওয়ারিয়ান

আমি .bash_profileফাইলটি নিয়ে কোনও সমস্যা দেখতে পাচ্ছি না । /etc/bashrcআমি এখানে যে বিষয়বস্তু রেখেছি তা সম্পর্কে, দয়া করে একবার দেখুন - পেস্টবিন.com
ইউএ

8

এটিই আমি নিয়ে এসেছি এবং এ পর্যন্ত আমি এতে সন্তুষ্ট…

alias hfix='history -n && history | sort -k2 -k1nr | uniq -f1 | sort -n | cut -c8- > ~/.tmp$$ && history -c && history -r ~/.tmp$$ && history -w && rm ~/.tmp$$'  
HISTCONTROL=ignorespace  
shopt -s histappend  
shopt -s extglob  
HISTSIZE=1000  
HISTFILESIZE=2000  
export HISTIGNORE="!(+(*\ *))"  
PROMPT_COMMAND="hfix; $PROMPT_COMMAND" 

নোট:

  • হ্যাঁ, এটি জটিল ... তবে, এটি সমস্ত নকলগুলি সরিয়ে দেয় এবং প্রতিটি টার্মিনালের মধ্যে কালানুক্রমিক সংরক্ষণ করে!
  • আমার HISTIGNOREসমস্ত কমান্ড উপেক্ষা করে যার যুক্তি নেই। কিছু লোকেরা এটি পছন্দসই নাও হতে পারে এবং ছেড়ে যেতেও পারে।

1

পরিবর্তে এটি ব্যবহার করুন:

HISTCONTROL=ignoreboth

0

এটি কার্যকর হয় না, কারণ আপনি ভুলে গেছেন:

 -n   read all history lines not already read from the history file
      and append them to the history list

এটি কার্যকর history -nহওয়ার পরে কেবল বগি বলে মনে হচ্ছে export HISTCONTROL=ignoreboth:erasedups

পরীক্ষা করতে দেয়:

$ PROMPT_COMMAND=
$ export HISTCONTROL=ignoreboth:erasedups
$ export HISTFILE=~/.bash_myhistory
$ HISTIGNORE='history:history -w'
$ history -c
$ history -w

এখানে আমরা মুছে ফেলা দু'টি চালু করি, কাস্টম ফাইলে ইতিহাস স্যুইচ করি, ইতিহাস সাফ করি। সমস্ত কমান্ড সমাপ্ত হওয়ার পরে আমাদের কাছে খালি ইতিহাস ফাইল এবং বর্তমান ইতিহাসে একটি কমান্ড রয়েছে।

$ history
$ cat ~/.bash_myhistory
$ history
$ 1  [2019-06-17 14:57:19] cat ~/.bash_myhistory

দ্বিতীয় টার্মিনাল খুলুন এবং সেই ছয়টি কমান্ডও চালান। তারপর:

$ echo "X"
$ echo "Y"
$ history -w
$ history
  1  [2019-06-17 15:00:21] echo "X"
  2  [2019-06-17 15:00:23] echo "Y"

এখন আপনার বর্তমান ইতিহাসে দুটি কমান্ড রয়েছে এবং ইতিহাসের ফাইলটি রয়েছে:

#1560772821
echo "X"
#1560772823
echo "Y"

প্রথম টার্মিনালে ফিরে:

$ history -n
$ history
1  [2019-06-17 14:57:19] cat ~/.bash_myhistory 
2  [2019-06-17 15:03:12] history -n

হু ... echoআদেশের কোনটিই পড়ে না। আবার দ্বিতীয় টার্মিনালে স্যুইচ করুন এবং:

$ echo "Z"
$ history -w

এখন ইতিহাস ফাইলটি হ'ল:

#1560772821
echo "X"
#1560772823
echo "Y"
#1560773057
echo "Z"

আবার প্রথম টার্মিনালে স্যুইচ করুন:

$ history -n
$ history
  1  [2019-06-17 14:57:19] cat ~/.bash_myhistory 
  2  [2019-06-17 15:03:12] history -n
echo "Z"

আপনি দেখতে পাচ্ছেন যে echo "Z"কমান্ডটি একত্রিত হয়েছে history -n

আর একটি ত্রুটি হ'ল আদেশটি ইতিহাস থেকে কমান্ড নম্বর দ্বারা পাঠানো হয় এবং কমান্ড সময় দ্বারা নয়, আমার ধারণা। আমি আশা করি echoইতিহাসে অন্য আদেশগুলি উপস্থিত হয়েছিল


0

মুছে ফেলাগুলি (কিছু ভাষায় চম্পের মতো) শীর্ষস্থানীয় এবং পিছনের স্থানগুলি ট্রিম করে না। এটি একটি বাগ। এছাড়াও মুছে ফেলা সমস্ত পূর্ববর্তী এন্ট্রি মুছবে না।

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