fc
bash kabuğunda yerleşik olan, geçmişin komutlarını düzenlemek ve yeniden çalıştırmak için yapılmış komuttur .
Öyle çok CygWin üzerinde mevcut ve ben test edildiği tüm Linux dağıtımlarında çalışır:
fc -s '\'='/' -1
Bazı açıklamalar
Neden "ikame başarısız oldu" hakkında bazı kelimeler
O için görünüyor s
değiştirici değil (henüz) ters eğik çizgi karakterinin ikame uygulanan \
kaçış biridir. Emin olmak için, örneğin bash geçmişi genişlemesinin gnu sürümünün kodunu görmeliyiz (ama yapmaya çalıştığınız şeyi elde etmek için yukarıdaki komut vardı ... bu yüzden tembel alıyorum ....).
Bazı notlar:
Birlikte çalıştığımız her RegEx'in işe yarayacağını düşünüyoruz sed
, ancak garanti edilmiyor. Ters eğik çizgi genişlemenin kaçış karakteri ve sorun burada. Dahası, genişlemenin davranışı shopt
seçeneklerle ilgilidir, bu yüzden duruma göre görmeye başlamalıyız ...
cd C:\Foo\Bar
Dizeyi bash kabuğunuza yapıştırdığınızda genişletilir ve yorumlayıcı için cd C:FooBar
; bu formda da $_
dahili değişkende saklanacaktır .
Bunun yerine yapıştırılmış cd "C:\Foo\Bar"
veya
değişken cd 'C:\Foo\Bar'
içinde $_
bulmalısınız C:\Foo\Bar
.
Geçmiş genişleme tam bir çizgi okunduktan sonra hemen gerçekleştiği için, kelimelere kabuk sonları onu önce, bazı ile kullanmak başlamak cazip olabilir bashism belki ekleyerek (bazı türev ile, örneğin daha fazla veya daha az düz, :p
ya da :q
, ""
, ayrıştırma vb.)
!!:0 ${_//\\/\/}
Bu güvenli olmadığını hatırlamak andır başlatmak için yolu ve oynamak için dosya adları onlar sayfa genel olarak okunan (windows panodan gelip, özellikle eğer Neden değil ayrıştırmak ls
? , Aslında kullanım sekmesine imkanı ile ilgilidir boşluklar ve satır başlıkları dosya adları ve dizin adları için doğru karakterler olarak ...).
Ayrıca , fare ile yakalanan bir metni yapıştırdığınızda, önde gelen bir alanı da yapıştırabilirsiniz. Bu, komutunuzun geçmişte bitmesini önleyebilir (kabuk seçeneklerine bağlıdır ...). Eğer öyleyse aşağıdakiler !!
kontrollü olmayan bir komut olacaktır ... ( başka bir cevaptaki örneğe bakınız ).Bu gereksiz bir somut risktir .
Sonuç
Geçmiş genişletmeleri , geçmiş listesinden sözcükleri giriş akışına ekleyerek komutları tekrar etmeyi, bağımsız değişkenleri bir önceki komuta geçerli giriş satırına eklemeyi veya önceki komutlardaki hataları hızla düzeltmeyi kolaylaştırır .
Kolay değilse yanlış bir şey yaptığımızı düşünmeye başlarım ;-)
Reklam nauseam: küçük bir deneme
histverify
Kabukta etkinleştirdim o zaman ...
shopt -s histverify
echo C:\Foo\Bar
!!:s|C|D| {1,2}A
sonra basın Enterve doğrulanmış genişleme olarak buldum
echo D:\Foo\Bar {1,2}A
sonra Entertekrar basıyorum ve yankılanıyor
D:FooBar 1A 2A
Bu substitution failed
, Brace genişlemesinden önce işlenen geçmiş genişlemesinde üretildiğini gösterir , bu yüzden her şeyden önce , s
tarih değiştiricinin \
karakterin yerine gerçek regex olarak işlenmediğini (henüz) işlemediğini doğrulamaktadır . ..
cd 'C:\foo\bar'