Pertama-tama, perhatikan bahwa riwayat Anda sudah ada dalam file. Jika Anda menjalankan bash, biasanya namanya ~/.bash_history
. Lebih khusus, itu adalah apa pun yang Anda atur variabelnya HISTFILE
. Jika Anda ingin menyalinnya ke file lain, jalankan sajacat "$HISTFILE" > hist.txt
Sekarang, mengapa history
perintah tidak bekerja dalam skrip bash shell, itu karena skrip dijalankan dalam cangkang anak non-interaktif dari sesi shell Anda saat ini. Kerang anak tidak mewarisi semua lingkungan induk (jadi tidak semua variabel yang ditetapkan), hanya variabel yang telah diekspor. Untuk menggambarkan, skrip di bawah ini akan menggemakan nilai variabel $var
:
#!/bin/bash
echo "$var"
Sekarang, atur $var
sesuatu dan jalankan skrip:
$ var="foo"
$ foo.sh
VAR:
Selanjutnya, ekspor variabel terlebih dahulu:
$ var="foo"
$ export var
$ foo.sh
VAR: foo
Seperti yang Anda lihat, ketika variabel telah diekspor, itu tersedia untuk shell anak.
Seperti yang saya sebutkan sebelumnya, riwayat disimpan dalam file yang ditunjukkan oleh variabel $HISTFILENAME
. Karena itu tidak diekspor secara default, itu tidak disetel saat menjalankan skrip:
$ cat foo.sh
#!/bin/bash
echo "HISTFILE: $HISTFILE"
$ ./foo.sh
HISTFILE:
$ echo $HISTFILE
/home/terdon/.bash_history
Seperti yang Anda lihat dalam contoh di atas, variabel HISTFILE
diatur dalam sesi shell normal saya, tetapi kosong saat menjalankan skrip.
Jadi, untuk mendapatkan riwayatnya, Anda memiliki beberapa opsi:
Nilai standarnya HISTFILE
adalah $HOME/.bash_history
. Jika Anda belum mengubahnya, Anda bisa menjalankan perintah ini di skrip Anda:
cat "$HOME/.bash_history" > history
Anda bisa meneruskan $HISTFILE
variabel ke skrip Anda dan cat
itu:
#!/bin/bash
cat "$1" > history
Simpan di atas sebagai foo.sh
dan jalankan seperti ini:
./foo.sh "$HISTORY"
Pastikan variabel diekspor. Tambahkan baris ini ke file Anda ~/.bash_profile
(jika ada) atau ~/.profile
(jika ~/.bash_profile
tidak ada):
export HISTFILE
Kemudian, keluar dan masuk kembali dan Anda harus dapat lari history > hist.txt
dari skrip seperti yang diharapkan. Ini karena export VAR
berarti "sediakan $ VAR untuk kulit anak". Dalam istilah praktis, ini berarti bahwa nilai HISTFILE
akan diwarisi oleh shell non-interaktif yang Anda gunakan untuk menjalankan skrip Anda.
Sekarang, sementara HISTFILE
akan diatur, itu belum dibaca oleh shell menjalankan skrip. Jadi, untuk membuatnya bekerja, Anda harus membacanya history -r
terlebih dahulu. Seluruh skrip akan terlihat seperti ini:
$!/bin/bash
history -r
history > hist.txt
Atau, cukup ekspor secara manual sebelum menjalankan skrip:
$ export HISTFILE
Tapi Anda masih harus melakukannya history -r
di skrip.
Anda dapat source
melakukannya seperti yang disarankan oleh jawaban @ p0llard .