বাশ: "ইতিহাস নম্বর" বনাম "কমান্ড নম্বর"


11

PS1 ভেরিয়েবলের মাধ্যমে কীভাবে আমার শেল প্রম্পটটি কাস্টমাইজ করা যায় তা গুগল করার সময়, আমি ব্যবহার করা যেতে পারে এমন বিশেষ অক্ষরের টেবিলগুলি দেখছি। নির্দিষ্টভাবে:

          \!     the history number of this command
          \#     the command number of this command

"ইতিহাস নম্বর" বেশি ব্যবহৃত হয় বলে মনে হয় এবং আমি জানি !523ইতিহাস থেকে কমান্ডগুলি পুনরায় করার মতো কমান্ডগুলি কীভাবে ব্যবহার করতে হয়। তবে "কমান্ড নম্বর" এর অনুরূপ কার্যকারিতা আছে কিনা তা আমি বুঝতে পারি না। আমি \#আমার PS1 ভেরিয়েবলটি রাখার চেষ্টা করেছি এবং মনে হয় কোনও নির্দিষ্ট সেশনে সন্নিবেশিত কমান্ডের সংখ্যা আউটপুট হবে (এর বিপরীতে \!, যা লগআউট / প্রস্থানের পরে অব্যাহত থাকে)।

যে কোনও সুবিধাজনক বা অর্থবহ উপায়ে "কমান্ড নম্বর" কীভাবে ব্যবহার করবেন জানেন?


2
আমি নেটটিতে বেশ গভীরভাবে অনুসন্ধান করেছি - কাছাকাছি আমি যেমন বলতে পারি, এই "কমান্ড নম্বর" কেবল মূল্যবান ইনফোয়ার হিসাবে এটি আপনাকে জানায় যে আপনি কতটি কমান্ড প্রবেশ করেছেন। ইতিহাস বিস্তারের মতো আমি এই সংখ্যাটি ইন্টারেক্টিভভাবে ব্যবহারের কোনও উপায় খুঁজে পাচ্ছি না
ল্যাঙ্গরিয়ান

1
আকর্ষণীয় প্রশ্ন। আপনি যদি এই মন্তব্যটির উত্তর দিয়ে থাকেন তবে আমি এটির জন্য ভোট দিয়েছি।
পিটার কর্ডেস

উত্তর:


1

বাশের কমান্ড নম্বরটি কেবল প্রদর্শনের জন্য।

প্রথমত bashref: এর থেকে কিছু পটভূমি :

কমান্ড নম্বর এবং ইতিহাস নম্বর সাধারণত পৃথক থাকে: কমান্ডের ইতিহাস নম্বরটি হিস্ট্রি তালিকার অবস্থান, যা ইতিহাসের ফাইল থেকে পুনরুদ্ধার করা কমান্ড অন্তর্ভুক্ত করতে পারে (* নোটের তাত্ত্বিক ইতিহাসের সুবিধাগুলি দ্রষ্টব্য: :), কমান্ড নম্বরটি হ'ল বর্তমান শেল সেশন চলাকালীন কমান্ডের অনুক্রমের অবস্থান।

উত্সের মাধ্যমে ডাইভিং, parse.yআমরা দেখতে পাই যে '\#'বৈশ্বিক স্থিতিশীল ভেরিয়েবলের সমাধান হয় current_command_number:

case '#':                                                                     
  n = current_command_number;                                                 
  /* If we have already incremented current_command_number (PS4,              
 ${var@P}), compensate */                                                     
  if (orig_string != ps0_prompt && orig_string != ps1_prompt && orig_string != ps2_prompt)
n--;                                                                          
  temp = itos (n);                                                            
  goto add_string;                                                            

যার কেবল একটির অন্য ব্যবহার রয়েছে: eval.cকমান্ড চালানোর পরে এটি বাড়ানো হয়েছে :

# ...
current_command_number++;                                                  

executing = 1;                                                             
stdin_redir = 0;                                                           

execute_command (current_command);                                         

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


5

আমি যতদূর বলতে পারি (এবং এটি আপনার গবেষণার মাধ্যমে নিশ্চিত হয়ে গেছে), সেই যাদু নম্বরটি ইন্টারেক্টিভভাবে উল্লেখ করার উপায় নেই, fcবা !nশর্টকাটগুলির মাধ্যমে নয় । এগুলি অবশ্যই ইতিহাস তালিকার নিখরচায় অবস্থান সম্পর্কিত উল্লেখ করেছে, এই নির্দিষ্ট শেলটি শুরু হওয়ার পর থেকে আপেক্ষিক অবস্থানটি নয় (যা \#আপনি সঠিকভাবে উল্লেখ করেছেন) w

এখানে এই সুন্দরটি তৈরি করার একমাত্র উপায় হ'ল নিম্নলিখিতটি সেট করা:

export HISTFILESIZE=1001
export HISTSIZE=-1

ঐ দিকে:

  1. একটি নতুন অধিবেশনটির ইতিহাস শুরু হয় 1000, যা একটি অধিবেশনে আমি কোথায় আছি তা সনাক্ত করা সহজ করে তোলে
  2. (কিছুটা সম্পর্কযুক্ত) আমি একটি নির্দিষ্ট অধিবেশনটিতে পুরানো ইতিহাস হারাব না (তবে এখনও ফাইলটি প্লাবিত করব না)

মূলত, এটি থেকে আমার পরিবর্তিত প্রম্পটটি চালু হয়েছে ( PS1="\\!$ ") থেকে:

499$ 

প্রতি:

1000$ 

... যা এটি শুরুতে একটু পরিষ্কার করে তোলে। তবে এটি সম্ভবত আপনি যে উত্তরটি খুঁজছিলেন তা নয়। :)

(যাইহোক, আমি একটি সমাধানের জন্য zsh এর দিকেও নজর দিয়েছি এবং মনে হয় এটির সমান পরিমাণ নেই), এটি কোনওভাবেই \#সহায়তা করে না))

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