Perintah history Bash: mencari dan mengelola riwayat
Perintah history di Bash menampilkan perintah sebelumnya yang diingat oleh shell saat ini beserta angkanya dan digunakan untuk mencari, menjalankan kembali, menghapus item, atau menyinkronkan dengan file riwayat. Untuk melihat hanya beberapa perintah terbaru, gunakan history 20; untuk mencari string tertentu, gunakan history | grep 'search term'; dan untuk menemukan perintah dengan cepat saat mengetik, gunakan Ctrl+r.
history adalah perintah bawaan di Bash. Penjelasan dalam artikel ini didasarkan pada Bash, dan shell lain seperti Zsh atau Fish mungkin memiliki berkas dan pengaturan riwayat yang berbeda.
Apa itu perintah history?
Bash menyimpan perintah yang dimasukkan oleh pengguna di shell interaktif dalam daftar riwayat memori. history adalah perintah yang memungkinkan Anda melihat dan mengedit daftar ini serta membaca atau menulis berkas riwayat yang ditunjukkan oleh HISTFILE.
Berkas riwayat default biasanya adalah ~/.bash_history. Ketika Bash dimulai, ia membaca berkas ini untuk membuat daftar riwayat memori, dan saat shell keluar secara normal, ia menyimpan riwayat saat ini ke berkas tersebut. Perilaku rinci dapat ditemukan dalam dokumentasi Fasilitas Riwayat GNU Bash .
Riwayat perintah adalah fitur kenyamanan, bukan log audit keamanan. Pengguna dapat menghapus entri, dan jika shell berhenti secara tidak normal atau pencatatan riwayat dinonaktifkan, riwayat tersebut mungkin tidak tersimpan.
Penggunaan Dasar
Menjalankan tanpa opsi akan mencetak riwayat sesi Bash saat ini dengan nomor.
history
Contoh keluaran adalah sebagai berikut.
241 apt update
242 systemctl status ssh
243 journalctl -u ssh
244 history
Untuk melihat hanya sebagian riwayat terbaru, seperti 20 entri terakhir, tentukan sebuah angka.
history 20
| Format | Fungsi | Hal-hal yang Perlu Diperhatikan |
|---|---|---|
history n |
Tampilkan n entri terakhir | Ini didasarkan pada daftar memori dari shell saat ini. |
history -c |
Hapus seluruh daftar catatan saat ini | Status sesi shell dan file lain harus dipertimbangkan secara terpisah. |
history -d number |
Hapus item yang ditentukan | Pertama, periksa apakah nomor yang akan dihapus benar. |
history -a |
Tambahkan item baru dari sesi ini ke akhir file | HISTFILE harus diatur. |
history -n |
Tambahkan entri baru dari file ke daftar saat ini | Berguna saat mengimpor catatan yang ditambahkan di sesi lain. |
history -r |
Tambahkan seluruh file riwayat ke daftar saat ini | Mungkin ada entri duplikat yang sudah ada. |
history -w |
Timpakan file riwayat dengan daftar saat ini | Jika beberapa terminal terbuka, itu dapat memengaruhi riwayat sesi lain. |
history -p expression |
Cetak hanya hasil dari perluasan riwayat | Ini berguna untuk memeriksa hasil perluasan dari ! sebelum eksekusi. |
history -s command |
Tambahkan ke riwayat tanpa mengeksekusi perintah | Ini masuk sebagai entri terakhir dari daftar riwayat saat ini. |
Untuk definisi yang tepat dan status kembalian dari setiap opsi, lihat dokumentasi GNU Bash History Builtins.
Mencari perintah sebelumnya
Menyaring daftar dengan grep
Jika Anda ingin melihat hanya baris-baris dalam riwayat yang berisi string tertentu, gunakan grep bersama dengan pipa.
history | grep 'systemctl'
Untuk mengabaikan huruf besar/kecil, gunakan grep -i.
history | grep -i 'nginx'
Metode ini nyaman untuk memeriksa hasil, tetapi perintah pencarian saat ini yang disertakan dalam output juga dapat muncul dalam hasil.
Mencari sambil mengetik dengan Ctrl+r
Jika Bash menggunakan mode pengeditan Emacs dasar, Anda dapat melakukan pencarian incremental terbalik dari perintah sebelumnya dengan Ctrl+r. Setiap kali Anda mengetik satu karakter untuk mencari, entri yang paling baru cocok akan ditampilkan, dan menekan Ctrl+r lagi akan berpindah ke hasil yang lebih lama.
Enter: Menjalankan perintah yang ditampilkan.- Tombol panah Kiri/Kanan: Menyelesaikan pencarian dan mengedit perintah.
Ctrl+g: Membatalkan pencarian dan kembali ke input asli.
Adalah praktik yang aman untuk mengakhiri pencarian menggunakan tombol panah tepat sebelum eksekusi untuk meninjau perintah dan argumennya. Metode pencarian dijelaskan dalam dokumentasi GNU Readline tentang pencarian riwayat perintah.
Jalankan Ulang Perintah Sebelumnya
Perluasan Riwayat Menggunakan Tanda Seru
Dalam Bash interaktif, Anda bisa menggunakan perluasan riwayat yang dimulai dengan ! untuk mengingat perintah sebelumnya.
| Ekspresi | Makna | Contoh |
|---|---|---|
!! |
Perintah Sebelumnya | sudo !! menambahkan sudo di depan perintah sebelumnya. |
!125 |
Perintah dengan nomor riwayat 125 | Anda bisa memeriksa nomornya dari keluaran history. |
!-3 |
Perintah ketiga sebelumnya dari posisi saat ini | Pilih perintah terbaru berdasarkan posisi relatif. |
!ssh |
Perintah terbaru yang dimulai dengan ssh | Jika ada banyak perintah dengan awalan yang sama, item yang tidak diharapkan mungkin akan dipilih. |
!?nginx? |
Perintah terbaru yang mengandung nginx | Cari berdasarkan string di tengah perintah. |
^old^new^ |
Ganti string pertama yang cocok dari perintah sebelumnya dan jalankan | Ini digunakan untuk memperbaiki kesalahan ketik singkat dan menjalankan lagi. |
Perluasan riwayat diaktifkan secara default dalam Bash interaktif, tetapi tidak dilakukan secara default dalam skrip shell non-interaktif. Untuk sintaks terperinci, lihat dokumentasi GNU Bash History Expansion.
Periksa hasil perluasan sebelum mengeksekusi
!number dan !string dapat mengeksekusi perintah yang ditemukan segera, jadi berhati-hatilah terutama jika ada perintah hapus, perubahan izin, atau shutdown sistem dalam riwayat. Jika Anda melewatkan ekspresi ke history -p dalam tanda kutip, Anda dapat memeriksa hasil perluasan tanpa mengeksekusinya.
history -p '!!'
history -p '!ssh'
Di Bash yang menggunakan Readline, mengatur opsi berikut memungkinkan hasil perluasan riwayat ditampilkan terlebih dahulu di buffer pengeditan tanpa eksekusi segera.
shopt -s histverify
Dalam berbagai lingkungan terminal di mana angka dapat berubah dengan mudah, seringkali lebih aman untuk mencari dengan Ctrl+r, memeriksa kontennya, dan kemudian mengeksekusi.
Hapus riwayat perintah
Hapus Entri Tertentu
Pertama, periksa angkanya dengan history lalu hapus entri yang sesuai dari daftar riwayat memori menggunakan opsi -d.
history -d 125
Jika Bash saat ini mendukung penghapusan rentang, Anda juga dapat menentukan angka awal dan akhir.
history -d 120-125
Untuk mencerminkan hasil penghapusan dalam file riwayat saat ini, Anda dapat memeriksa daftar dan mencadangkan file terlebih dahulu sebelum menjalankan history -w, karena perintah itu menimpa file riwayat. Namun, perlu diingat bahwa sesi terminal lain mungkin nantinya menulis kembali riwayat sebelumnya ke file saat keluar, jadi pastikan tidak ada beberapa sesi yang terbuka.
Hapus Seluruh Daftar Saat Ini
Opsi -c menghapus semua entri dalam daftar riwayat di memori shell saat ini.
history -c
Untuk memperbarui file riwayat agar sesuai dengan daftar saat ini, Anda harus memahami cara kerja history -w sebelum menggunakannya. Penghapusan riwayat hanya menargetkan riwayat shell dan tidak menghapus log sistem, log audit, cadangan, atau riwayat dari terminal lain.
File Riwayat dan Beberapa Sesi Terminal
Bash memiliki daftar riwayat memori terpisah untuk setiap shell yang sedang berjalan. Secara default, perintah yang baru saja dijalankan di terminal lain mungkin tidak langsung muncul di history terminal saat ini.
| Perintah | Perilaku antara file riwayat dan sesi saat ini |
|---|---|
history -a |
Menambahkan riwayat baru dari sesi saat ini yang belum disimpan ke file ke akhir file. |
history -n |
Menambahkan baris baru dari file riwayat yang belum dibaca oleh sesi saat ini ke daftar memori. |
history -r |
Menambahkan seluruh isi file riwayat ke akhir daftar memori saat ini. |
history -w |
Menimpa file riwayat dengan seluruh daftar memori saat ini. |
Untuk memasukkan riwayat baru dari terminal lain, jalankan history -a di terminal sumber, lalu history -n di terminal penerima; dua perintah di bawah dilakukan di dua sesi yang berbeda.
history -a
history -n
Anda dapat menggunakan opsi histappend untuk menambahkan entri baru daripada menimpa file riwayat saat shell keluar.
shopt -s histappend
Untuk terus menggunakan pengaturan ini, tambahkan ke ~/.bashrc pengguna. Ada juga cara untuk mengatur PROMPT_COMMAND agar secara otomatis menyinkronkan pada setiap prompt dari beberapa terminal, tetapi Anda tidak boleh menimpanya tanpa memeriksa nilai saat ini, karena pengaturan atau program yang ada mungkin menggunakan variabel ini.
Pengaturan variabel lingkungan terkait riwayat
| Variabel | Peran |
|---|---|
HISTFILE |
Jalur ke file tempat sejarah disimpan. Nilai default yang umum adalah ~/.bash_history. |
HISTSIZE |
Jumlah maksimum perintah yang disimpan dalam daftar riwayat memori shell saat ini. |
HISTFILESIZE |
Membatasi ukuran maksimum file riwayat dalam jumlah baris. |
HISTCONTROL |
Mengatur aturan penyimpanan, seperti tidak merekam perintah yang diawali dengan spasi atau perintah duplikat berturut-turut. |
HISTIGNORE |
Menentukan pola perintah yang dikecualikan dari perekaman, dipisahkan oleh titik dua. |
HISTTIMEFORMAT |
Menentukan format tanggal dan waktu yang ditampilkan dalam output history. |
Sebagai contoh, pengaturan berikut mempertahankan 5.000 entri dalam memori dan maksimal 10.000 baris dalam file riwayat, mengurangi perintah yang dimulai dengan spasi dan perintah duplikat, serta menampilkan tanggal dan waktu.
HISTSIZE=5000
HISTFILESIZE=10000
HISTCONTROL=ignoreboth:erasedups
HISTTIMEFORMAT='%F %T '
shopt -s histappend
Untuk menerapkannya secara terus-menerus, tambahkan pengaturan di atas ke ~/.bashrc, lalu mulai sesi Bash baru atau muat ulang file konfigurasi.
source ~/.bashrc
HISTCONTROL=ignoreboth menerapkan baik ignorespace maupun ignoredups. erasedups menghapus entri sebelumnya yang identik dengan perintah baru dari daftar riwayat. Aturan rinci untuk setiap variabel dapat ditemukan dalam Dokumentasi Variabel GNU Bash.
Riwayat perintah dan keamanan
Jika Anda memasukkan kata sandi, kunci API, token, atau konten kunci pribadi sebagai argumen baris perintah, mereka bisa terekspos tidak hanya di riwayat shell tetapi juga dalam informasi proses yang berjalan atau log lainnya. Untuk informasi sensitif, disarankan untuk tidak memasukkannya langsung di baris perintah tetapi menggunakan input standar yang disediakan oleh program, penyimpanan kredensial yang aman, atau file konfigurasi dengan akses terbatas.
Jika ignorespace diatur di HISTCONTROL, perintah yang diawali dengan spasi dapat dikecualikan dari riwayat. Namun, Anda harus bergantung pada apakah pengaturan ini benar-benar aktif, dan hal ini tidak mencegah log lainnya, jadi tidak seharusnya hanya mengandalkan metode ini sebagai perlindungan informasi sensitif.
printf '%s\n' "$HISTCONTROL"
printf '%s\n' "$HISTFILE"
Bahkan jika Anda menghapus entri dengan history -d atau history -c, informasi yang sama mungkin tetap ada di sesi shell lain, cadangan, log audit, dan log aplikasi. Jika kredensial terekspos, jangan hanya menghapus riwayat; Anda harus membatalkan kata sandi atau token yang terkena dampak dan mengeluarkan yang baru.
Masalah umum
Perintah terbaru dari terminal lain tidak terlihat
Setiap sesi Bash menggunakan daftar memori yang independen. Setelah mengeksekusi history -a di terminal tempat perintah dijalankan, cobalah mengeksekusi history -n di terminal yang ingin Anda periksa. Dalam jangka panjang, Anda dapat meninjau histappend dan pengaturan inisialisasi shell.
Riwayat hilang setelah menutup terminal
HISTFILE mungkin kosong atau Anda mungkin tidak memiliki izin untuk menulis ke file riwayat, atau HISTSIZE atau HISTFILESIZE mungkin diatur ke 0. Jika shell dihentikan secara paksa, proses penyimpanan riwayat saat keluar mungkin tidak dilakukan.
Nomor riwayat telah berubah dari sebelumnya.
Nomor riwayat bukan pengenal tetap tetapi posisi dalam daftar memori saat ini. Jika Anda menghapus entri atau memuat ulang file untuk menggabungkan riwayat dari sesi lain, nomor dapat berubah. Lebih aman untuk mencari dan memeriksa isi perintah daripada mengingat dan menjalankan nomor lama.
Apakah pengaturan yang sama bisa digunakan di Zsh atau Fish?
Tidak bisa diterapkan begitu saja. Bahkan jika ada fitur bernama history, file riwayat dan cara sinkronisasinya dengan variabel lingkungan berbeda untuk setiap shell. Variabel SHELL biasanya menunjukkan shell login yang dikonfigurasi, bukan selalu shell aktif; gunakan ps -p $$ -o args= sebagai petunjuk tambahan dan periksa dokumentasi shell tersebut.
Ringkasan
history di Bash dapat digunakan tidak hanya untuk melihat perintah sebelumnya tetapi juga untuk menghapus entri tertentu, membaca/menulis file riwayat, dan menyinkronkan antar sesi. Untuk pencarian sehari-hari, history | grep dan Ctrl+r sangat praktis, dan ketika mengeksekusi ulang menggunakan ekspansi riwayat, perlu terlebih dahulu memeriksa isi perintah.
Untuk mengubah jumlah dan metode penyimpanan catatan, tinjau HISTSIZE, HISTFILESIZE, HISTCONTROL, HISTTIMEFORMAT, dan histappend secara bersamaan. Tujuan dari perintah lain dapat ditemukan berdasarkan tugas di daftar perintah Linux (bahasa Inggris).




