কমান্ড-ইতিহাসে পরিবর্তনগুলি কীভাবে পূর্বাবস্থায় ফেলা যায়?


12

ইউনিক্স সিস্টেমে আপনি পূর্ববর্তী কমান্ডগুলির মাধ্যমে নেভিগেট করতে উপরের এবং নীচের তীরগুলি টিপতে পারেন। এটি অত্যন্ত সুবিধাজনক y

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

কীগুলির মাধ্যমে অ্যাক্সেস করা ইতিহাসে কমান্ডের পরিবর্তনগুলি "পূর্বাবস্থায় ফেলার" কোনও উপায় আছে কি?

আমার বর্তমান কাজটি হ'ল #কমান্ডটি প্রিপেন্ড করা । এইভাবে বর্তমান কমান্ডটি একটি মন্তব্য হিসাবে সম্পাদিত হয়, তাই কিছুই ঘটে না। তারপরে, আমি কীগুলি দিয়ে কমান্ডগুলি দিয়ে আবার ব্রাউজ করতে পারি। সমস্যাটি হ'ল আমি যে কমান্ডটি ব্যবহার করছিলাম সেটি তালিকায় অনেক দূরে থাকতে পারে, সুতরাং আবার দু'শবার উপরে যাওয়া কিছুটা is নিয়ন্ত্রণ + আর কোনও সমাধান নয়, যেহেতু আমি ঠিক কী খুঁজছিলাম তা আমি মনে করতে পারি না।

উদাহরণ

আমি নিম্নলিখিত "50 টি আদেশ আগে" টাইপ করেছি:

ls -l /etc/httpd/conf/

এখন আমি সেই লাইনে গিয়ে এটিকে পরিবর্তন করেছি

ls -l /etc/init.d/

কিন্তু প্রবেশ টিপেনি। এখন, আমি ls -l /etc/httpd/conf/আবার যেতে চাই ।

আমার পরিবেশ

$ echo $SHELL
/bin/bash
$ echo $TERM
xterm

কমান্ডের ইতিহাস পরিবর্তন করা হ'ল এটি সম্ভবত আপনি ব্যবহার করা শেলটির একটি (ভুল) বৈশিষ্ট্য। ইন ksh, উদাহরণস্বরূপ, আপনি ইতিহাস এন্ট্রিগুলি সম্পাদনা এবং এন্ট্রির "পূর্ববর্তী সংস্করণ" না মুছে তাদেরকে ডাকা যেতে পারে; আপনার কাছে সমস্ত অনুরোধ করা কমান্ড উপলব্ধ।
জানিস

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

1
এছাড়াও এই ক্ষেত্রে, kshএখানে আচরণের পার্থক্য রয়েছে বলে মনে হয়। এবং আপনার ইতিহাস সম্পাদনা বিকল্পগুলিও চয়ন সংশোধন মোডের উপর নির্ভর করে। ইন kshএর ষষ্ঠ-মোড, উদাহরণস্বরূপ, পুরাতন এন্ট্রি ওভাররাইট নয়, এবং আমি এও মত একটি পূর্বাবস্থা কমান্ড করতে পারেন viসঙ্গে, 'U'।
জানিস

আহস, এটি খুব আশাব্যঞ্জক মনে হচ্ছে। আমি এখন বাশে কাজ করছি এবং বর্তমানে পরিবর্তনের বিষয়ে বিবেচনা করছি না ksh, তবে এই জাতীয় জিনিসটি সেখানে রয়েছে তা জেনে রাখা ভাল।
ফেডরকিই

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

উত্তর:


10

যতক্ষণ আপনি ইতিহাসের এন্ট্রি সম্পাদনা করেছেন তবে Enterএখনও টিপছেন না, আসল প্রবেশে ফিরে যেতে বার বার Ctrl+ _- undoকমান্ড টিপুন - যতক্ষণ না এটি কোনও আরও পরিবর্তন না করে। আপনি আসল প্রবেশে ফিরে এসেছেন।


5

আপনি যখন লাইনে একাধিক পরিবর্তন করেছেন তখন মূল কমান্ডে ফিরে যান :

revert-line (M-r) 
    Undo all changes made to this line. This is like 
executing the undo command enough times to get back to the beginning.

Mমেটা কী, যা altrআমার জন্য।


কৃতজ্ঞ, তবুও সহায়ক তথ্য

আপনি যখন আছে ওপি মত কমান্ড পূর্বে করেছে (এটা ঘটবে) মৃত্যুদন্ড কার্যকর, সেখানে "পূর্বাবস্থা" কারণ কমান্ড পরিচালনা করা হয় এবং দ্বারা স্মরণ করার কিছুই নেই গনুহ Readline গ্রন্থাগারের হয় লেখা না$HISTFILE শেল প্রস্থানের পর্যন্ত। কারণ আপনি শুধু না পারেন, কারণ আমি এই উল্লেখ করা হয় এক মত আশা করতে পারে এবং এটি শেল থেকে প্রস্থান করার জন্য আদর্শ হতে পারে না।grep$HISTFILE

সুতরাং পূর্ববর্তী সমস্ত পঠন কমান্ডের মাধ্যমে আপনাকে আবার স্ক্রোল করা থেকে বাঁচানোর জন্য বেশ কয়েকটি বিকল্প রয়েছে।

যদি আপনি কিছু কমান্ড মনে রাখেন তবে ctrl+ টিপুন rএবং সেই স্ট্রিংটি সহ পূর্ববর্তী কমান্ডগুলির মাধ্যমে অনুসন্ধান করতে যা মনে আছে তা টাইপ করুন । আবার ctrl+ টিপুন rপরবর্তী সাম্প্রতিকটি প্রদর্শন করবে এবং পিছনের দিকে অনুসন্ধান করবে।

উদাহরণস্বরূপ, ls -lতারপরে আপনার অনুসন্ধান করা পূর্ববর্তী কমান্ডটি সন্ধান করতে যতবার সময় লিখুন ততবার ctrl+ টাইপ করুন r। আপনি যদি এটি অতীতে স্ক্রোল করেন তবে ctrl+ sবর্তমান অবস্থান থেকে অনুসন্ধান করবে।

fcব্যাশ কমান্ড builtin পূর্ববর্তী readline কমান্ড পাশাপাশি সূচক সংখ্যার তালিকা সহায়ক।

fc -l -100 রিডলাইনে আগের 100 কমান্ডগুলি তালিকাভুক্ত করবে।

অতিরিক্ত হিসাবে, ওপি যদি জানতে পারে যে সে আগের ls -lকমান্ডটি সন্ধান করছে, তবে তিনি আউটপুটটি পাইপ করতে পারতেন grepযেমন:fc -l -100 | grep 'ls -l'

এটি ls -lসূচক সংখ্যার আগে পূর্ববর্তী কমান্ডগুলির একটি তালিকা আউটপুট করে। আউটপুটটি দেখতে এটির মতো দেখাচ্ছে:
2065 ls -l

এখন আপনি ইভেন্টের ডিজাইনারটি ব্যবহার করতে পারেন !nযেখানে nসূচীর নম্বর। এই উদাহরণে, নির্বাহক !2065প্রসারিত হবে ls -l


যদিও এটি বাস্তবতার পরে সহায়তা করে না, পূর্ববর্তী কমান্ডগুলি সংশোধন করার সময় যে কেউ সাম্প্রতিক কমান্ডের ইতিহাস সংরক্ষণ করতে চাইছে সেটির HISTORY EXPANSIONবিভাগটি দেখতে হবে man bash। ইতিহাস ওভাররাইট না করে পুরানো কমান্ডগুলি সংশোধন করার জন্য এখানে কিছু বিকল্প পদ্ধতি রয়েছে।

Event Designatorsঅধ্যায় দেখায় কিভাবে আপনি যা করতে পারেন সহজে অতি সম্প্রতি যেটি ব্যবহার হুকুম থেকে সম্পাদন করা পংক্তি।

^string1^string2^
              Quick  substitution.  Repeat the previous command, replacing string1 with string2.  Equivalent to
              ``!!:s/string1/string2/'' (see Modifiers below).

উদাহরণ:

$ echo foo
foo 
$ ^foo^bar
echo bar
bar

সর্বাধিক সাম্প্রতিক কমান্ডগুলি এখন প্রদর্শিত হবে:

echo foo
echo bar

উপরের উদাহরণটি কীভাবে sedইভেন্ট ডিজাইনারকে স্ট্রিং প্রতিস্থাপন করতে ব্যবহার করতে হয় তাও ব্যাখ্যা করে ।

!-n    Refer to the current command minus n.

সুতরাং যদি ইতিহাসে 3 টি কমান্ড থাকে echo fooতবে আপনি ব্যবহার করতে পারেন:
!-3:s/foo/bar

নোট করুন যে ইভেন্ট ডিজাইনাররা আপনার ইতিহাসে এই আদেশটি কার্যকর করা কমান্ড হিসাবে উপস্থিত হবে echo bar। ইতিহাসে এটি প্রদর্শিত হবে না !-3:s/foo/bar

এটি ওপরে সন্ধান করার চেয়ে "পূর্বাবস্থায়" সমাধান সন্ধানের চেয়ে "করণীয়" বেশি হলেও, এটি নিবিড়ভাবে সম্পর্কিত বলে মনে হচ্ছে কেবল সেখানে ফেলে দেওয়া।


এটি দুর্দান্ত, বিস্তারিত তথ্যের জন্য অনেক ধন্যবাদ। আমি গিলসের উত্তর গ্রহণ করছি যেহেতু এটি আমি যা খুঁজছি ঠিক তাই করে, তবে আপনি এখানে ধরে নিয়েছেন যে আমি যে আদেশটি পুনরায় করতে চাইছি তা সম্পর্কে আমি অনেক কিছুই জানি যা সবসময় হয় না।
ফেডরকিই

হাঁ আমি একমত. যদি পূর্বে ফিরিয়ে দেওয়া বৈশিষ্ট্যটি আমি আগে কোনওভাবে কমান্ডগুলি প্রবেশ করানো হয় তবে এটি দুর্দান্ত হবে।
আইরিন 1'15
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.