Bagaimana saya bisa menyimpan perintah terakhir ke file?

29

Ketika saya menjalankan analisis saya menggunakan bash shell, saya sering ingin menyimpan perintah yang saya gunakan yang memberi saya hasil yang baik ke file di direktori yang sama ("LOGBOOK" saya, sesuai namanya) sehingga saya dapat memeriksa apa Saya lakukan untuk mendapatkan hasil itu. Sejauh ini, ini berarti saya menyalin. Mengecek perintah dari terminal atau menekan "naik" untuk memodifikasi perintah menjadi echo"my command" >> LOGBOOK, atau kejenakaan serupa lainnya.

Saya menemukan ada historyalat tempo hari, tetapi saya tidak dapat menemukan cara menggunakannya untuk mendapatkan perintah yang sebelumnya dieksekusi sehingga saya dapat melakukan sesuatu seperti getlast >> LOGBOOK.

Apakah ada cara mudah yang bagus untuk melakukan ini. Atau, bagaimana orang lain berurusan dengan menyimpan perintah untuk hasil yang mereka miliki?

MattLBeck
sumber

Jawaban:

37

Jika Anda menggunakan bash, Anda dapat menggunakan fcperintah untuk menampilkan riwayat Anda seperti yang Anda inginkan:

fc -ln -1

Itu akan mencetak perintah terakhir Anda. -lberarti daftar, -nberarti tidak membuat awalan baris dengan nomor perintah dan -1mengatakan untuk menunjukkan hanya perintah terakhir. Jika spasi putih di awal baris (hanya baris pertama pada perintah multi-baris) yang merepotkan, Anda dapat membuangnya dengan cukup mudah sed. Jadikan itu menjadi fungsi shell, dan Anda memiliki solusi seperti yang diminta ( getlast >> LOGBOOK):

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

Itu seharusnya berfungsi seperti yang Anda tanyakan dalam pertanyaan Anda.

Saya telah menambahkan sedikit variasi dengan menambahkan "$1" "$1"ke fcperintah. Ini akan memungkinkan Anda untuk mengatakan, misalnya, getlast mycommanduntuk mencetak baris perintah terakhir yang dipanggil mycommand, jadi jika Anda lupa menyimpan sebelum menjalankan perintah lain, Anda masih dapat dengan mudah menyimpan instance terakhir dari perintah. Jika Anda tidak meneruskan argumen ke getlast(yaitu memanggil fcsebagai fc -ln "" "", itu hanya mencetak perintah terakhir saja).

[Catatan: Jawaban diedit ke akun untuk komentar @ Bram dan masalah yang disebutkan dalam jawaban @glenn jackman.]

camh
sumber
5
Bentuk pertama fc -lnr | head -n 1bisa disingkat fc -lnr -1.
Bram
@Ram: Bagus. Saya menggunakan help fcuntuk dokumentasi saya. Halaman bash man memiliki lebih banyak detail, termasuk penggunaan indeks negatif ini. Menghilangkan headitu bagus karena satu perintah yang tersisa adalah built-in jadi sekarang tidak ada fork / exec.
camh
1
Saya bertanya-tanya mengapa perintah ini disebut fc...
imz - Ivan Zakharyaschev
2
Itu adalah singkatan dari "fix command". gnu.org/software/bash/manual/bashref.html#Bash-History-Builtins
Mikel
9

Satu masalah dengan jawaban @ camh adalah jika Anda memiliki perintah yang merentang beberapa baris, itu hanya menunjukkan baris pertama:

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

$ fc -lnr | head -1
         echo "one

Coba ini:

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

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

$ getlast
         echo "one
two
three"
glenn jackman
sumber
3
mengaktifkan cmdhistakan memperbaikinya: "Jika diatur, bash mencoba untuk menyimpan semua baris perintah beberapa baris dalam entri riwayat yang sama. Ini memungkinkan pengeditan ulang perintah multi-baris dengan mudah."
Mark McKinstry
2

Alih-alih menggunakan panah atas, Anda dapat menggunakan "!!"untuk merujuk ke perintah sebelumnya.

misalnya

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

Catatan: ini tidak mengutip teks literal

ryanbraganza
sumber
5
Itu tidak akan menangkap perintah literal. Jika ada karakter meta shell, mereka akan dievaluasi dan diganti. Pipa juga akan pecah: ls | less-> echo !! >> LOGBOOK-> echo ls | less >> LOGBOOK.
camh
0

Anda bisa melakukannya dengan perintah berikut jika Anda menggunakan bash shell:

$> history -a LOGBOOK

Ini akan menambahkan semua perintah Anda dari sesi saat ini ke file itu, Anda juga dapat menambahkan alias pada file ~ / .bashrc Anda untuk melakukan ini dengan satu perintah:

$> alias getlast="history -a LOGBOOK"
stringbasic
sumber
1
Tapi Anda kehilangan persyaratan yang lebih penting bahwa saya hanya menyimpan perintah yang berfungsi dan mendapatkan hasil yang saya miliki. Saya tidak ingin menyimpan semua perintah terbaru yang saya lakukan, cukup pilih yang setelah saya menggunakannya. Bagaimanapun, terima kasih.
MattLBeck