Dalam artikel saya, Parsing Bash history, saya mendemonstrasikan cara mereferensikan item di history
shell Anda dengan nomor baris serta dengan posisi kata. Setelah Anda menguasai parsing Bash history
menurut indeks baris dan kata, Anda dapat memanfaatkan pengubah yang tersedia untuk history
perintah.
Opsi histexpand shell
Sebelum membahas history
parsing, perlu disebutkan bahwa tanda seru (!
) notasi hanya tersedia untuk shell Bash Anda berkat histexpand
pilihan. Karena histexpand
diaktifkan secara default, banyak pengguna tidak pernah memberikan banyak pertimbangan. Namun, itu adalah opsi yang memberlakukan perluasan !
ke daftar history
entri.
Jika opsi dimatikan, Anda kehilangan fungsi ini. Misalnya:
$ echo foo
$ set +o histexpand
$ !-2
bash: !-2: command not found
$ set -o histexpand
$ !-3
echo foo
foo
Secara umum, histexpand
aktif secara default, kecuali dalam shell non-interaktif (misalnya, dalam skrip shell). Haruskah history
steno pernah mengecewakan Anda, Anda dapat mengaktifkan histexpand
sebagai opsi shell atau gunakan history
lengkap perintah tersirat oleh histexpand
:
$ echo foo
$ set +o histexpand
$ history -p !-2
echo foo
foo
Dalam skrip shell, Anda harus mengaktifkan history
dan berikan lokasi di mana history
dapat disimpan:
HISTFILE=/tmp/history.log
set -o histexpand
set -e
## some code here
## clean up
rm /tmp/history.log
Keuntungan meninggalkan histexpand
dinonaktifkan adalah Anda kehilangan verbositas hasil history
tindakan. Misalnya, dengan histexpand
diaktifkan, hal pertama yang dikembalikan ke shell Anda setelah history
perintah adalah versi yang diperluas dari apa yang sedang dijalankan:
$ set -o histexpand
$ echo foo
foo
$ !!
echo foo
foo
Dengan histexpand
dimatikan, history
your Anda perintah lebih panjang, tetapi hasilnya lebih singkat:
$ set +o histexpand
$ echo foo
foo
$ !!
foo
Apakah Anda menemukan kegunaan untuk history
dalam skrip shell terserah Anda, tetapi history
pengubah memiliki beberapa pintasan menarik yang membuatnya sangat nyaman dalam beberapa kasus.
Pengubah sejarah
Pengubah history
pilihan ditandai dengan titik dua (:
) diikuti oleh satu karakter pengubah. Beberapa pengubah dapat digabungkan dengan yang lain.
Akhiran nama file
Untuk menghilangkan akhiran argumen, gunakan r
pengubah.
Ini mirip dengan basename
.
$ ls -lgGh aLongFileNameWith-a_complex-syntax-1.tgz
-rw-r--r-- 1 0 Mar 9 11:23 aFileNameWith-a_complex-syntax-1.rev.tgz
$ echo !!:2:r
echo aLongFileNameWith-a_complex-syntax-1
aLongFileNameWith-a_complex-syntax-1
r
pengubah tidak super cerdas. Itu hanya menemukan titik terakhir dalam nama file dan memotong akhiran, yang terkadang mungkin tidak cocok dengan apa yang Anda pikirkan sebagai akhiran file, jadi dalam beberapa hal, basename
menawarkan fleksibilitas yang lebih besar.
$ set +o histexpand
$ ls -lgGh aLongFileNameWith-a_complex-syntax-1.tar.gz
$ echo !!:2:r
aLongFileNameWith-a_complex-syntax-1.tar
Hasil sebaliknya dapat dicapai dengan e
pengubah:
$ set +o histexpand
$ echo aLongFileNameWith-a_complex-syntax-1.tgz
aLongFileNameWith-a_complex-syntax-1.tgz
$ echo !!:2:e
.tgz
Nama file
Versi sederhana dari dirname
tersedia dengan h
pengubah:
$ set +o histexpand
$ echo src/spacer.sh
src/spacer.sh
$ echo !!^:h
src
Dan sisi lain dari ekspresi itu tersedia dengan t
pengubah:
$ set +o histexpand
$ echo src/spacer.sh
src/spacer.sh
$ echo !!^:t
spacer.sh
Substitusi string
Mungkin pengubah history
yang paling berguna secara luas adalah substitusi string. Misalnya, setiap admin dari lingkungan campuran telah mengetik ini ke dalam kotak Red Hat Enterprise Linux di beberapa titik:
$ sudo apt install tmux
Kesalahan seperti itu mudah diperbaiki dengan substitusi string:
$ ^apt^dnf
sudo dnf install tmux
Anda bahkan dapat menambahkan beberapa opsi:
$ ^apt^dnf -y
sudo dnf -y install tmux
history
ini sintaks adalah singkatan dari s
pengubah. Sintaks lengkapnya adalah, misalnya, !!:s/apt/dnf
dan oleh karena itu dapat berguna untuk item beberapa baris di belakang history
. Asumsikan Anda mengeluarkan perintah yang berguna tiga perintah kembali, dan ingin menjalankan perintah serupa sekarang:
$ !-3:s/vi/emacs/
sudo dnf install -y emacs
Seperti sed
, penggantian ini secara default hanya terjadi sekali, tetapi Anda dapat menjadikannya global (dalam kaitannya dengan baris yang Anda ingat) dengan g
pengubah:
$ pip update pip
[...]
$ !!:gs:/pip/pip3/
pip3 update pip3
Keselamatan pertama:cara melakukan riwayat dry-run
Menekan Return
setelah history
yang dimodifikasi baris terkadang bisa membuat stres, terutama ketika baris yang ingin Anda jalankan kembali terletak di antara perintah yang sangat berbahaya atau memengaruhi file penting. Jika Anda ingin memverifikasi perintah yang akan Anda ubah dan jalankan, Anda dapat menggunakan p
pengubah di ujung belakang history
modifikasi.
$ !-32:0-:s/mv/trash/:p
trash important.txt status.txt pay.txt
Perintah yang Anda lihat sebagai hasilnya adalah item yang diperluas dari history
, tapi belum dijalankan. Anda dapat menjalankannya secara manual, dengan menekan tombol Up
panah atau Ctrl+P
, sekarang telah diselesaikan untuk Anda. Menggunakan verifikasi (p
) umumnya merupakan ide yang bagus jika Anda baru menggunakan history
perintah dalam produksi.
Menutup
Riwayat Bash Anda dapat berguna untuk banyak hal, apakah itu melihat kembali apa yang telah Anda lakukan sepanjang hari, atau hanya membuat pekerjaan Anda lebih efisien dengan menggunakan kembali potongan informasi yang telah Anda cari tahu. Semakin banyak Anda berlatih dengan pengubah sejarah, semakin berguna mereka menjadi. Biarkan diri Anda (hati-hati) tersandung melalui beberapa saat Anda mempelajari sintaks, dan segera Anda akan mengingat perintah dan argumen dengan menekan tombol lebih sedikit daripada sebelumnya.
[ Ingin mencoba Red Hat Enterprise Linux? Unduh sekarang secara gratis. ]