Komutlar-geçmişindeki değişiklikler nasıl geri alınır?


12

UNIX sistemlerinde, önceki komutlarda gezinmek için üst ve alt oklara basabilirsiniz. Bu son derece kullanışlıdır.

Bazen yukarı çıkıp tekrar kullanmak istediğim bir komut bulurum, ancak bazı varyasyonlarla. Bu tür değişiklikler yaparsam, kontrol etmediğim sürece orijinal komutu geri almanın bir yolu yoktur history.

Geçmişteki tuşlarla erişilen komuttaki değişiklikleri "geri almanın" bir yolu var mı?

Geçerli geçici çözümüm, a'nın başına a eklemektir #. Bu şekilde geçerli komut yorum olarak gerçekleştirilir, böylece hiçbir şey olmaz. Ardından, tuşları kullanarak komutlara tekrar göz atabilirim. Sorun şu ki, kullandığım komut listede çok uzak olabilir, bu yüzden iki yüz kat yukarı çıkmak biraz fazla. Control + R de bir çözüm değil, çünkü tam olarak ne aradığımı hatırlamayabilirim.

Misal

Aşağıdaki "50 komut önce" yazdım:

ls -l /etc/httpd/conf/

Şimdi bu çizgiye gittim ve değiştirdim

ls -l /etc/init.d/

ancak enter tuşuna basmadı. Şimdi, ls -l /etc/httpd/conf/tekrar gitmek istiyorum .

Çevrem

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

Komut geçmişinin değiştirilmesi muhtemelen kullandığınız kabuğun (mis-) bir özelliğidir. In kshörneğin, tarih girişlerini düzenleyebilir ve giriş "önceki sürümünü" silmeden onlara çağırmak; tüm çağrılan komutları kullanabilirsiniz.
Janis

"Değişiyor" ile kastediyorum: oklarla ulaştıktan sonra değiştirdiğim önceki bir komut verildiğinde, oklarla yukarı ve aşağı gidersem, eski komut nasıl olduğunu göstermez, ama değiştirdiğim yol o. Tabii ki, bir komut yerine "enter" yazarsam, bu eski komut başlangıçta olduğu gibi olacaktır; ama bu kesinlikle kaçınmaya çalışıyorum ve "başlangıç ​​değerine" komutu sıfırlamak için bir yol arıyorum.
fedorqui

1
Ayrıca bu durumda, kshdavranışı burada farklı görünüyor. Geçmiş düzenleme seçenekleriniz de seçilen düzenleme moduna bağlıdır. In ksh'ın vi-modu, örneğin, eski giriş yazılmaz, ben de olduğu gibi bir geri alma komutu verebilirsiniz viile 'u'.
Janis

Ahh, kulağa çok umut verici geliyor. Şimdi Bash'te çalışıyorum ve şu anda değiştirmeyi düşünmüyorum ksh, ancak böyle bir şeyin orada olduğunu bilmek güzel.
fedorqui

Kabuk kapatıldığında geçmiş dosyasına yazmadan önce bash'ın en son komut geçmişini nerede sakladığını bilmek istiyorum. Bunun mümkün olup olmadığının belirlenmesine yardımcı olabilir. Bir kimse? Kabuk değişkenlerinden birinde olabileceğini düşündüm, ancak şu anda el kitabına göz atmak için zamanım yok.
iyrin

Yanıtlar:


10

Sürece bir geçmiş girdisi düzenlendiğini ancak basılmadı ettik Enterhenüz orijinal girişi, defalarca basına dönmek Ctrl+ _- undoKomut - herhangi başka bir değişiklik yapmaz kadar. Orijinal girişe geri döndün.


5

Satırda birden fazla değişiklik yaptığınızda orijinal komuta geri dönün :

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.

Mbenim için olan meta anahtar altr.


Tuhaf, Henüz Yararlı Bilgiler

Ne zaman gelmiş (olur) OP gibi bir komut daha önce yapmış idam komutları ele ve hatırlanan tarafından çünkü "geri alma" bir şey yok GNU Readline kütüphanesi ve edilir yazılmaz$HISTFILE kabuk çıkar kadar. Sadece olamaz çünkü bu söz nedenidir biri gibi beklediğinizden ve kabuk çıkmak için ideal olmayabilir.grep$HISTFILE

İşte size önceki tüm okuma satırı komutları arasında gezinmenizi sağlayan birkaç seçenek.

Komutun bir kısmını hatırlarsanız , ctrl+ tuşuna basın rve o dizeyi içeren önceki komutlarda aramak için hatırladığınız şeyi yazın . ctrl+ Düğmesine rtekrar basıldığında geriye doğru arama yapılarak en son görüntülenen görüntülenir.

Örneğin, ls -ldaha sonra aradığınız önceki komutu bulmak için gereken kadar ctrl+ ryazın. Yanından kaydırırsanız, ctrl+ sgeçerli konumdan ileriye doğru arama yapar.

fcKomutu yerleşik bash önceki taleb komutları yanında indeks numaralarını listelemek için yararlıdır.

fc -l -100 önceki 100 komutu readline içinde listeleyecektir.

Buna ek olarak, OP önceki bir ls -lkomutu aradığını biliyorsa , çıktıyı aşağıdaki grepgibi oluşturabilir:fc -l -100 | grep 'ls -l'

Bu ls -lişlemden önce bir dizin numarası ile gelen önceki komutların bir listesini çıkarmalıdır . Çıktı şöyle görünür:
2065 ls -l

Şimdi olay göstericili kullanabilirsiniz dizin numarasıdır. Bu örnekte, yürütme genişleyecektir .!nn!2065ls -l


Bu durumdan sonra yardımcı olmasa da, önceki komutları değiştirirken son komut geçmişini korumak isteyen herkesin HISTORY EXPANSIONbölümünü görmelidir man bash. Geçmişin üzerine yazmadan eski komutları değiştirmek için bazı alternatif yöntemler.

Bu Event Designatorsbölüm, en son kullanılan komuttan dizeyi kolayca nasıl düzenleyebileceğinizi gösterir.

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

Misal:

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

En son komutlar şimdi gösterilecek:

echo foo
echo bar

Yukarıdaki örnek ayrıca sedbir olay belirleyicisindeki bir dizenin yerine nasıl kullanılacağını da açıklar .

!-n    Refer to the current command minus n.

Yani geçmişte 3 komut echo foovarsa, şunu kullanırsınız:
!-3:s/foo/bar

Olay göstergelerinin geçmişinizde, bu durumda yürütülen komut olarak görüneceğini unutmayın echo bar. Tarihte olarak görünmez !-3:s/foo/bar.

OP'nin aradığı "geri al" çözümünden daha çok "yapmayın" olsa bile, yakından ilişkili göründüğü gibi oraya atmak.


Bu güzel, detaylı bilgi için çok teşekkürler. Ben tam olarak aradığım şeyi yaptığı için Gilles'in cevabını kabul ediyorum, oysa burada tekrarlamak istediğim komut hakkında birçok şey bildiğimi varsayıyorum, bu her zaman böyle değil.
fedorqui

Evet katılıyorum. Bu geri alma özelliğinin daha önce bir şekilde girmiş olduğum komutlara genişletilmesi harika olurdu.
iyrin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.