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 historyperintah 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 $varsesuatu 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 HISTFILEdiatur dalam sesi shell normal saya, tetapi kosong saat menjalankan skrip.
Jadi, untuk mendapatkan riwayatnya, Anda memiliki beberapa opsi:
Nilai standarnya HISTFILEadalah $HOME/.bash_history. Jika Anda belum mengubahnya, Anda bisa menjalankan perintah ini di skrip Anda:
cat "$HOME/.bash_history" > history
Anda bisa meneruskan $HISTFILEvariabel ke skrip Anda dan catitu:
#!/bin/bash
cat "$1" > history
Simpan di atas sebagai foo.shdan jalankan seperti ini:
./foo.sh "$HISTORY"
Pastikan variabel diekspor. Tambahkan baris ini ke file Anda ~/.bash_profile(jika ada) atau ~/.profile(jika ~/.bash_profiletidak ada):
export HISTFILE
Kemudian, keluar dan masuk kembali dan Anda harus dapat lari history > hist.txtdari skrip seperti yang diharapkan. Ini karena export VARberarti "sediakan $ VAR untuk kulit anak". Dalam istilah praktis, ini berarti bahwa nilai HISTFILEakan diwarisi oleh shell non-interaktif yang Anda gunakan untuk menjalankan skrip Anda.
Sekarang, sementara HISTFILEakan diatur, itu belum dibaca oleh shell menjalankan skrip. Jadi, untuk membuatnya bekerja, Anda harus membacanya history -rterlebih 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 -rdi skrip.
Anda dapat sourcemelakukannya seperti yang disarankan oleh jawaban @ p0llard .