"History" berhenti bekerja ketika dijalankan di dalam skrip bash

9

Saya menulis skrip sederhana untuk memahami riwayat bash saya untuk menemukan string tertentu. Di baris perintah, saya bisa melakukan hal berikut, yang berfungsi dengan baik:

history | grep git

Namun, ketika saya membuat skrip bash dengan perintah yang sama seperti di atas, tiba-tiba historytidak menghasilkan apa-apa:

#!/bin/bash
history | grep git

Ketika saya menghapus baris pertama #!/bin/bash, skrip saya berfungsi lagi. Apa yang terjadi disini? Bagaimana saya bisa menggunakan historydi dalam skrip bash?

Martin Vegter
sumber

Jawaban:

8

Berikut ini adalah untuk bash 4.0 or higher only, tetapi itu berhasil. :)

#!/bin/bash -i
history | grep sometext

Bekerja! Cobalah. ( -i= saya aktif, flag tidak tersedia untuk bash 3.x dan sebelumnya)

kesalahan sintaks
sumber
Terima kasih juga kepada pria yang baru-baru ini menurunkan saya hanya karena dia bisa. (Mungkin bashpengguna v3, karena frustrasi, haha). Setidaknya bagi Martin solusi saya sangat membantu, itu (setidaknya) kenyamanan.
syntaxerror
Saya memiliki pertanyaan yang sama ketika saya sedang menulis alat yang mencatat pekerjaan setelah jam kantor untuk teknisi pendukung 24/7 .. terima kasih!
Henry van Megen
14

Saat Anda menjalankan skrip bash shell, misalnya dengan menjalankan file yang dapat dieksekusi dengan garis shebang #!/bin/bash, skrip dijalankan dalam shell non-interaktif. Salah satu fitur dari shell non-interaktif adalah sejarah dinonaktifkan. Jadi jika Anda ingin skrip Anda dapat menggunakan riwayat, Anda harus melakukan sesuatu seperti ini:

#!/bin/bash
HISTFILE=~/.bash_history   # Or wherever you bash history file lives
set -o history             # enable history
history | grep git

Tentu saja, dalam hal ini Anda bisa saja melakukan:

grep git ~/.bash_history

Karena kedua hal di atas mengharuskan file histori ( ~/.bash_history) diperbarui, yang hampir pasti tidak akan.

Saya tidak yakin bagaimana Anda menjalankan skrip Anda setelah garis shebang dihapus. Sumber file (mis., Dengan .) tidak sama dengan menjalankan skrip karena perintah dijalankan di shell saat ini, yang memang memiliki riwayat diaktifkan.

rici
sumber
Bagaimana dengan melakukan history -asetelah perintah yang ditetapkan untuk memastikan perintah terakhir ditambahkan ke file terlebih dahulu?
4
@ illuminÉ: tidak akan membantu. Shell mulai menjalankan skrip adalah proses yang sepenuhnya berbeda; dimulai dengan sejarah kosong frsh.
rici