Riwayat bash sangat kuat. Memahami cara menggunakan ekspansi riwayat bash secara efektif akan membuat Anda sangat produktif di baris perintah Linux.
Artikel ini menjelaskan 15 contoh yang menggunakan fitur perluasan riwayat bash berikut:
- Penanda acara – Mengacu pada perintah tertentu dalam riwayat. Dimulai dengan !
- Penanda kata – Mengacu pada kata tertentu dari entri riwayat. Biasanya ini digabungkan dengan penunjuk genap. Bahkan penanda dan penanda kata dipisahkan oleh titik dua
- Modifier – Memodifikasi hasil substitusi yang dilakukan oleh event atau word designators
Artikel ini adalah bagian dari Seri Tutorial Bash kami yang sedang berlangsung.
Seperti yang sudah Anda ketahui, untuk melihat semua entri riwayat, gunakan perintah riwayat. Ini akan menampilkan semua perintah yang dieksekusi sebelumnya bersama dengan nomor untuk perintah itu di tabel riwayat.
$ history 1 tar cvf etc.tar /etc/ 2 cp /etc/passwd /backup 3 ps -ef | grep http 4 service sshd restart 5 /usr/local/apache2/bin/apachectl restart
Penanda Acara Sejarah Bash
1. Jalankan perintah tertentu dari riwayat menggunakan !n
Jika Anda telah menjalankan perintah sebelumnya, daripada mengetik ulang lagi, Anda dapat dengan cepat menjalankannya dengan menggunakan nomor yang sesuai dari perintah dalam riwayat.
Misalnya, untuk menjalankan perintah #4, lakukan hal berikut. Ini akan menampilkan perintah #4 dari riwayat, dan segera menjalankannya.
$ !4 service sshd restart
Untuk menjalankan perintah yang diketikkan 2 perintah kembali, lakukan hal berikut.
$ !-2
Untuk menjalankan perintah sebelumnya, lakukan salah satu dari yang berikut:
$ !! $ !-1
Anda juga dapat menekan
Jika Anda telah mengaktifkan pengeditan gaya vi untuk baris perintah menggunakan 'set -o vi', gunakan
2. Jalankan perintah dengan kata kunci menggunakan !string dan !?string
Anda juga dapat menggunakan kata kunci untuk menjalankan perintah dari riwayat.
Contoh berikut akan mencari perintah sebelumnya yang MULAI dengan kata kunci "ps" dan jalankan. Dalam contoh ini, ia mengambil perintah sebelumnya “ps -ef | grep http” dan jalankan.
$ !ps ps -ef | grep http
Contoh berikut akan mencari perintah sebelumnya yang BERISI kata kunci "apache" dan jalankan. Dalam contoh ini, ia mengambil perintah sebelumnya “/usr/local/apache2/bin/apachectl restart” dan menjalankannya.
$ !?apache /usr/local/apache2/bin/apachectl restart
3. Ganti string dari perintah sebelumnya menggunakan ^str1^str2^
Dalam contoh berikut, pertama-tama kita menjalankan perintah ls untuk memverifikasi file. Kemudian kami menyadari bahwa kami ingin melihat konten file. Alih-alih mengetikkan seluruh nama file lagi, kita bisa mengganti "ls" pada perintah sebelumnya dengan "cat" seperti yang ditunjukkan di bawah ini.
$ ls /etc/cron.daily/logrotate $ ^ls^cat^ cat /etc/cron.daily/logrotate
Catatan:Untuk tips riwayat bash tambahan, lihat 15 Contoh Untuk Menguasai Sejarah Baris Perintah Linux. Ini menjelaskan cara menampilkan stempel waktu dalam riwayat, dan cara menggunakan berbagai variabel lingkungan terkait riwayat termasuk HISTTIMEFORMAT, HISTSIZE, HISTFILE, HISTCONTROL, dan HISTIGNORE
Penanda Kata Sejarah Bash
Word designators sangat membantu ketika Anda ingin mengetikkan perintah baru, tetapi menggunakan argumen dari salah satu perintah yang telah dieksekusi sebelumnya. Beberapa contohnya ditunjukkan di bawah ini.
4. Dapatkan argumen pertama dari sebuah perintah menggunakan :^
Dalam contoh berikut, “!cp:^” diberikan sebagai argumen untuk perintah “ls -l”. “!cp:^” menempatkan perintah sebelumnya dalam riwayat yang dimulai dengan “cp” dan mendapatkan argumen pertama dari perintah tersebut.
$ cp /etc/passwd /backup $ ls -l !cp:^ ls -l /etc/passwd
Contoh berikut mendapatkan argumen pertama dari perintah sebelumnya.
$ ls -l !!:^
5. Dapatkan argumen terakhir dari sebuah perintah menggunakan :$
Pada contoh berikut, “!cp:$” diberikan sebagai argumen untuk perintah “ls -l”. “!cp:$” menempatkan perintah sebelumnya dalam riwayat yang dimulai dengan “cp” dan mendapatkan argumen terakhir dari perintah tersebut.
$ cp /etc/passwd /backup $ ls -l !cp:$ ls -l /backup
Contoh berikut mendapatkan argumen terakhir dari perintah sebelumnya.
$ls -l !!:$
6. Dapatkan argumen ke-n dari suatu perintah menggunakan :n
Pada contoh berikut, “!tar:2” diberikan sebagai argumen untuk perintah “ls -l”. “!tar:2” menempatkan perintah sebelumnya dalam riwayat yang dimulai dengan “tar” dan mendapatkan argumen ke-2 dari perintah tersebut.
$ tar cvfz /backup/home-dir-backup.tar.gz /home $ ls -l !tar:2 ls -l /backup/home-dir-backup.tar.gz
7. Dapatkan semua argumen dari sebuah perintah menggunakan :*
Pada contoh berikut, “!cp:*” diberikan sebagai argumen untuk perintah “ls -l”. “!cp:*” menempatkan perintah sebelumnya dalam histori yang dimulai dengan “cp” dan mendapatkan semua argumennya.
$ cp /etc/passwd /backup $ ls -l !cp:* ls -l /etc/passwd /backup
8. Lihat kata yang baru-baru ini dicari menggunakan !%
Seperti yang kami jelaskan di atas, “!?apache” akan mencari perintah history sebelumnya yang MENGANDUNG kata kunci “apache” dan menjalankannya.
$ /usr/local/apache2/bin/apachectl restart $ !?apache /usr/local/apache2/bin/apachectl restart
!% akan merujuk ke seluruh kata yang dicocokkan dengan "?" cari.
Misalnya, Jika Anda telah mencari "?apache" sebelumnya, "!%" akan cocok dengan seluruh kata "/usr/local/apache2/bin/apachectl". Perhatikan bahwa “/” diperlakukan sebagai bagian dari satu kata dalam konteks ini.
Jadi, dalam hal ini, dengan menjalankan perintah berikut, Anda dapat menghentikan apache.
$ !% stop /usr/local/apache2/bin/apachectl stop
9. Dapatkan berbagai argumen dari perintah menggunakan xy
Pada contoh berikut, “!tar:3-5” diberikan sebagai argumen untuk perintah “ls -l”. “!tar:3-5” menempatkan perintah sebelumnya dalam riwayat yang dimulai dengan “tar” dan mendapatkan argumen dari 3 hingga 5.
$ tar cvf home-dir.tar john jason ramesh rita $ ls -l !tar:3-5 ls -l john jason ramesh
Berikut ini mendapatkan semua argumen dari 2.
$ ls -l !tar:2-$
Harap perhatikan hal berikut:
- !!:* Mengambil semua argumen dari perintah sebelumnya
- !!:2* Mengambil semua argumen mulai dari argumen ke-2.
- !!:2-$ Sama seperti di atas. Dapatkan semua argumen mulai dari argumen ke-2.
- !!:2- Mengambil semua argumen mulai dari argumen ke-2 (kecuali argumen terakhir).
Pengubah Riwayat Bash
Pengubah diberikan setelah kata penunjuk, seperti yang dijelaskan dalam contoh di bawah ini.
10. Hapus nama jalur tambahan dari kata menggunakan :h
Dalam contoh berikut, “!!:$:h” mengambil argumen terakhir dari perintah sebelumnya, dan menghapus nama jalur tambahan. Dalam hal ini, ia menghapus nama file, dan hanya mendapatkan path lengkap.
$ ls -l /very/long/path/name/file-name.txt $ ls -l !!:$:h ls -l /very/long/path/name
11. Hapus semua nama jalur utama dari sebuah kata menggunakan :t
Ini adalah kebalikan dari contoh sebelumnya.
Dalam contoh berikut, “!!:$:t” mengambil argumen terakhir dari perintah sebelumnya, dan menghapus semua nama jalur utama. Dalam hal ini, hanya mendapatkan nama file.
$ ls -l /very/long/path/name/file-name.txt $ ls -l !!:$:t ls -l file-name.txt
12. Hapus ekstensi nama file dari kata menggunakan :r
Dalam contoh berikut, "!!:$:r" mengambil argumen terakhir dari perintah sebelumnya, dan hanya menghapus ".suffix" (yang merupakan ekstensi nama file di sini). Dalam hal ini, ia menghapus .txt
$ ls -l /very/long/path/name/file-name.txt $ ls -l !!:$:r ls -l /very/long/path/name/file-name
13. Sed seperti Substitusi dalam riwayat bash menggunakan :s/str1/str2/
Alih-alih menggunakan "^original^replacement^" seperti yang telah kita bahas sebelumnya, kita juga dapat menggunakan substitusi seperti sed dalam riwayat bash seperti yang ditunjukkan pada contoh di bawah ini. Ini mungkin mudah diingat. !! adalah untuk memanggil perintah sebelumnya, “:s/original-string/replacement-string/” adalah sintaks seperti sed untuk mengganti string.
$ !!:s/ls -l/cat/
Anda juga dapat menggunakan flag g (bersama dengan flag s) untuk melakukan substitusi global seperti yang ditunjukkan di bawah ini. Ini berguna jika Anda salah mengetik beberapa kata dan ingin mengubah semuanya sekaligus dan menjalankan perintah lagi.
Pada contoh berikut, secara tidak sengaja saya memberikan “password” dua kali (bukan passwd).
$ cp /etc/password /backup/password.bak
Untuk mengatasinya, lakukan saja substitusi seperti substitusi global history berikut.
$ !!:gs/password/passwd/ cp /etc/passwd /backup/passwd.bak
14. Ulangi substitusi dengan cepat menggunakan :&
Jika Anda telah berhasil menjalankan substitusi riwayat bash seperti yang ditunjukkan di atas, Anda dapat mengulangi substitusi yang sama dengan cepat lagi menggunakan :&.
Saya tidak sengaja mengetik "kata sandi" lagi alih-alih "passwd" di perintah lain.
$ tar cvf password.tar /etc/password
Sekarang, alih-alih mengetik ulang perintah, atau melakukan "gs/password/passwd", saya bisa menggunakan ":&", yang akan menggunakan kembali substitusi terakhir. Gunakan “:g&” untuk menggunakan kembali substitusi terakhir secara global.
$ !!:g& tar cvf passwd.tar /etc/passwd
15. Cetak perintah tanpa menjalankannya menggunakan :p
Ini sangat membantu ketika Anda melakukan penggantian riwayat yang kompleks, dan Anda ingin melihat perintah terakhir sebelum menjalankannya.
Pada contoh berikut, “!tar:3-:p”, tidak benar-benar menjalankan perintah.
Karena kami telah memberikan ":p" di sini, itu hanya melakukan substitusi dan menampilkan perintah baru. Setelah Anda memverifikasi perluasan riwayat bash, dan jika menurut Anda ini adalah perintah yang ingin Anda jalankan, hapus “:p” dan jalankan lagi.
$ tar cvf home-dir.tar john jason ramesh rita $ tar cvfz new-file.tar !tar:3-:p tar cvfz new-file.tar john jason ramesh