Son komutu bir dosyaya nasıl kaydedebilirim?


29

Analizlerimi bash kabuğunu kullanarak çalıştırdığımda, sık sık kullandığım komutları aynı dizindeki bir dosyaya (iyi bir sonuç verdim) (yani "benim" LOGBOOK "olarak adlandırılır) kaydetmek istiyorum. Bu sonuçları almak için yaptım. Şimdiye kadar bu, komutun terminalden kopyalanması ya da komutu bir "veya" echo"my command" >> LOGBOOKbenzeri antics olarak değiştirmek için "yukarı" ya basmak anlamına geliyordu .

historyGeçen gün bir araç buldum , ancak daha önce yürütülen bir komutu almak için kullanmanın bir yolunu bulamıyorum, böylece böyle bir şey yapabilirim getlast >> LOGBOOK.

Bunu yapmak için güzel bir kolay yolu var mı. Alternatif olarak, diğerleri komutları, sahip oldukları sonuçlar için kaydetme ile nasıl başa çıkmaktadır?

Yanıtlar:


37

Kullanıyorsanız , geçmişinizi istediğiniz şekilde görüntülemek için komutu bashkullanabilirsiniz fc:

fc -ln -1

Bu senin son emrini yazdıracak. -lliste -nanlamına gelir, komut numaralarına sahip satırları ön eklememek anlamına gelir ve -1sadece son komutu göstermek için. Çizginin başlangıcındaki boşluk (yalnızca çok satırlı komutlarda ilk satır) rahatsız edici ise, ondan kolayca kurtulabilirsiniz sed. Bunu bir kabuk fonksiyonuna getirin ve istendiği gibi bir çözümünüz var ( getlast >> LOGBOOK):

getlast() {
    fc -ln "$1" "$1" | sed '1s/^[[:space:]]*//'
}

Sorunuzda istediğiniz gibi çalışmalıdır.

Ben ekleyerek hafif bir değişim eklemiş "$1" "$1"için fckomuta. Bu, örneğin, getlast mycommandçağıran son komut satırını yazdırmak için söylemenizi sağlar, mycommandböylece başka bir komutu çalıştırmadan önce kaydetmeyi unuttuysanız, komutun son örneğini kolayca kaydedebilirsiniz. Eğer bir bağımsız değişken geçirmeye yoksa getlast(yani çağırmak fcolarak fc -ln "" ""sadece son komutu sadece dışarı yazdırır).

[Not: Cevap @ Bram'in yorumunu ve @glenn jackman'ın cevabında belirtilen sorunu açıklayacak şekilde düzenlendi.]


5
İlk form fc -lnr | head -n 1kısaltılabilir fc -lnr -1.
Bram

@Bram: İyi şeyler. help fcBelgelerim için kullanıyordum . Bash man sayfası, negatif endekslerin kullanımı da dahil olmak üzere daha fazla ayrıntıya sahiptir. Ortadan kaldırmak headiyidir, çünkü kalan tek komut yerleşiktir, bu yüzden şimdi çatal / exec yoktur.
camh

1
Neden emir denir acaba fc...
imz - İvan Zakharşyaschev


9

@ Camh'ın cevabındaki bir sorun, birden fazla satırı kapsayan bir komutunuz varsa, sadece ilk satırı gösterir:

$ echo "one
> two
> three"
one
two
three

$ fc -lnr | head -1
         echo "one

Bunu dene:

$ alias getlast='fc -nl $((HISTCMD - 1))'

$ echo "one
> two
> three"
one
two
three

$ getlast
         echo "one
two
three"

3
etkinleştirmek cmdhistşunları düzeltir: "Ayarlanırsa, bash aynı tarih girişinde çok satırlı bir komutun tüm satırlarını kaydetmeye çalışır. Bu, çok satırlı komutların kolayca yeniden düzenlenmesini sağlar."
Mark McKinstry

2

Yukarı oku kullanmak yerine "!!"önceki komuta başvurmak için kullanabilirsiniz .

Örneğin

$ some -long --command --difficulty="very hard to remember"
$ echo "!!" >> LOGBOOK

not: Bu, değişmez metni alıntılamaz


5
Bu değişmez komutu yakalamaz. Herhangi bir kabuk metaaktörü varsa, bunlar değerlendirilecek ve ikame edilecektir. Boru hatları da kırılacak: ls | less-> echo !! >> LOGBOOK-> echo ls | less >> LOGBOOK.
camh

0

Bash shell kullanıyorsanız bunu aşağıdaki komutla yapabilirsiniz:

$> history -a LOGBOOK

Bu işlem, tüm komutlarınızı o anki oturumdan bu dosyaya ekler, ayrıca bunu yapmak için ~ / .bashrc dosyasına bir takma ad ekleyebilirsiniz:

$> alias getlast="history -a LOGBOOK"

1
Ancak, yalnızca işe yarayan ve elde ettiğim sonuçları alan komutları sakladığımdan daha önemli bir gereksinimi kaçırıyorsunuz. Yaptığım tüm son komutları kaydetmek istemiyorum , sadece kullandıktan sonra olanları seçin. Yine de teşekkürler.
MattLBeck
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.