GNU/Linux >> Belajar Linux >  >> Linux

Menggunakan pengubah kata dengan riwayat Bash di Linux

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. ]


Linux
  1. Cara Menghapus Riwayat Baris Perintah BASH di Linux

  2. Menggunakan Perintah Tidur Linux di Skrip Bash

  3. Contoh penggunaan pipa bernama di Linux Bash

  1. Cara Menghapus Riwayat Bash di Linux

  2. Mengurai riwayat Bash di Linux

  3. Dapatkan Subnet mask di Linux menggunakan bash

  1. Menggunakan Bungkus Kata Dengan Mc?

  2. Menggunakan Perintah Nama Dasar Linux di Skrip Bash

  3. Menggunakan SDL2 di linux dengan g++?