it-swarm.asia

كيف يمكنني البحث في سجل bash وإعادة تشغيل الأمر؟

هل يمكنني البحث في السجل في bash وتشغيل النتيجة؟

288
Richard Hoskins

نوع CtrlR في سطر الأوامر والبدء في كتابة الأمر السابق. بمجرد ظهور النتيجة ، استمر في الضرب CtrlR لرؤية المباريات الأخرى. عندما يظهر الأمر الذي تريده ، اضغط ببساطة Enter

لاحظ أنه في حين CtrlR هو الإعداد الافتراضي ، إذا كنت تريد أن يرتبط الأمر (reverse-search-historyCtrlT يمكنك تكوين ذلك بما يلي:

 ربط '"\ C-t": سجل البحث العكسي' [...]

هناك مجموعة كاملة من الأوامر القابلة للقراءة الأخرى المتاحة لك أيضًا. ألق نظرة على bash man man page .

يحتوي Bash على العديد من المرافق للبحث والوصول إلى سجل الأوامر التفاعلي. أبسط منها هو history المدمج. الكتابة فقط:

 $ التاريخ 

سيتم طباعة قائمة بالأوامر إلى جانب فهرس رقمي ، مثل:

 $ history 
 1 clear 
 2 ls -al 
 3 vim ~/somefile.txt 
 4 history 
 $ 

يمكنك بعد ذلك تنفيذ أي من هذه الأوامر باستخدام الفهرس الرقمي الخاص بها عن طريق إعداد الفهرس بـ ! واحد ، مثل Mitch أشار إلى:

 $! 1 

سيتم تنفيذ الأمر clear. يحتوي السجل المدمج على العديد من الميزات نفسها ، يمكنك رؤية المزيد في صفحات الرجل bash و history.

يمكنك أيضًا تحديد الإزاحات السلبية النسبية عند استخدام محدد ! ، لذلك باستخدام قائمة محفوظاتنا أعلاه ، إذا أردنا تنفيذ vim مرة أخرى ، فيمكننا القيام بما يلي:

 $! -2 

التي تخبر باش أساسًا بتنفيذ الأمر الذي قمت بتشغيله "قبل أمرين". لتشغيل الأمر السابق في قائمة المحفوظات ، يمكننا فقط استخدام !! (وهو اختصار لـ !-1 فقط).

لا يحددك ! المحدد عدديًا لتحديد الأمر الذي سيتم تشغيله. hayalci أظهر أنه يمكنك توجيه bash لتنفيذ أمر يعتمد إما على النص الذي يبدأ بـ (باستخدام !) أو نص داخل الأمر نفسه (باستخدام !?). مرة أخرى ، باستخدام قائمة محفوظات المثال أعلاه ، إذا أردنا تنفيذ clear مرة أخرى ، فكل ما نحتاج إلى فعله هو الكتابة:

 $! cl 

و اضغط Enter. وماذا عن vim؟ هذا بسيط مثل:

 $!؟ بعض 

النقطة الأكثر أهمية من استجابة hayalci هي الدعوة إلى shopt المدمج:

 $ shopt -s histverify 

سيؤدي هذا إلى تمكين التحقق من السجل بحيث لا يتم تنفيذ الأوامر التي تمت مطابقتها بواسطة مصممي ! و !! و !? بشكل أعمى ، ولكن بدلاً من ذلك تم ملؤها في سطر الأوامر حتى تتمكن من التأكد من أنها لن تفعل أي شر قبل تنفيذها. هذا الأمر أكثر أهمية عند تنفيذ الأوامر كمستخدم الجذر. يمكن تعيين هذا الخيار في ملف بدء التشغيل .bashrc بحيث يتم تعيينه كلما قمت بتسجيل الدخول.

كما سبق الإشارة إليه ، يمكن الحصول على كل هذه المعلومات من bash man man . ل! ،! ، و!؟ أيها الموقرون ، نلقي نظرة على القسم 9.3 توسيع التاريخ .

421
Sean Bright

كبديل ل crtl+R، يمكنك البحث في السجل عن طريق الكتابة

!text

سيبحث هذا في السجل عن آخر أمر يبدأ مع "نص".

لكنني اقترح عليك وضع هذا في .bashrc لمنع تنفيذ أمر خاطئ.

shopt -s histverify

هذا يرشد bash بحيث ، بعد any إجراءات السجل (مثل !!:s/prev_text/after_text) ، فإنه يضع السطر الناتج إلى موجه الأوامر. ثم يمكنك مراجعة الأمر أو تحريره ، ثم اضغط على Enter بعد ذلك.

36
hayalci

يمكنك أيضًا القيام بما يلي:

history | grep "stuff"

سيعود شيء مثل

num stuff

ثم يمكنك الكتابة

!num
30
Mitch

أنا أفضل استخدام سجل البحث إلى الوراء عبر سجل البحث العكسي. السابق يتيح لك كتابة بضعة أحرف من الأمر ثم اضغط على مفتاح البحث ، بدلاً من ضرب مفتاح البحث أولاً ثم كتابة سلسلة البحث.

بشكل افتراضي على نظامي ، ترتبط M-p و M-n بوظائف مماثلة ولكنني أفضل ربط مفاتيح الأسهم:

bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
14
Keith

لدي اسم مستعار عظيم حقا ، ح. إنه حقًا مجرد "history | grep" ، لكنني أقوم بتصفية إدخالات "أمر h" السابقة باستخدام "grep -E -v"

alias h="history | grep -E -v '^ *[0-9]+ *h ' | grep "

تستخدم مثل

h aliases
2003  less .bash_aliases
12
CurtH

كتابة ممتازة ، شون! لقد وضعت هذا في تعليق ، لكنني خجول نقاط سمعة قليلة. :-)

تقنية أخرى ذات صلة ومفيدة هي القدرة على تشغيل أمر سابق أثناء تغيير كلمة. لنفترض أنك قمت بكتابة اسم الدليل أو كتبته أو تريد تغيير اسم الملف:

$ echo اسمي bob 
 اسمي bob 
 $ ^ bob ^ jordan 
 صدى اسمي jordan 
 اسمي jordan

لاحظ أنه تم توسيع الأمر واستبداله وإخراجه قبل تشغيل الأمر ، لذا إذا تم تشغيل الأمر غير الصحيح ، فيمكنك رؤية ما اعتقدت أن bash تقوم به.

12
Jordan

نظرًا لأن التنقل عبر السجل باستخدام Ctrl-r مرهق لنظام IMO ، فقد ترغب في مراعاة hh :

https://github.com/dvorka/hstr

مما يجعل التنقل أكثر بساطة ووضوحًا وكفاءة - بما في ذلك تشغيل الأمر:

enter image description here

5
Martin Dvorak

في موجه الأوامر bash ، اكتب control-R ، ثم اكتب بضعة أحرف من الأمر الذي تريده ، وسوف تبحث أداة القراءة السريعة للباش من خلال سجل الأوامر لهذا الأمر.

بعد بدء البحث ، يمكنك كتابة control-R مرة أخرى للانتقال إلى أمر المطابقة التالي.

3
John1024

إذا قمت بتكوين Shell الخاص بك لاستخدام روابط المفتاح vi (set -o vi أو وجود set editing-mode vi في $HOME/.inputrc) ، فأنت تبحث مع <Esc>/some-command<Return> واضغط على n (التالي) أو Shift-n (السابق) للتنقل عبر سجل سطر الأوامر.

3
Fernando Basso

CTRL+R يعمل بشكل جيد ، كما اقترح @ John1024 ، لكنه شاق إلى حد ما إذا كان العديد من الأوامر الحديثة متشابهة وتريد طريقة سريعة لفحصها جميعًا. سيكون البديل هو استخدام history :

$ history | grep keyword
2
Mureinik