Bagaimana cara menyimpan dan mengakses perintah yang sering digunakan dengan cepat?


37

Saya memiliki banyak perintah yang secara rutin perlu saya jalankan, seringkali dengan sedikit variasi.

Saat ini saya menyimpan semuanya .bash_historydan menggunakannya CTRL- Runtuk mengaksesnya, tapi saya ingin tahu apakah ada cara yang lebih baik. Apa yang saya cari:

  • Mudah untuk menambahkan perintah baru
  • Mudah untuk mencari dan menjalankan kembali perintah yang diinginkan
  • Hindari perintah yang tidak diinginkan dalam saran

Sayangnya, bash_history tidak begitu kuat pada permintaan ketiga: jika saya melakukan beberapa cddan ls, itu mengisi file histori dengan cepat. Saya baru-baru ini belajar tentang HIST_SIZEdan bahwa Anda dapat mengkonfigurasi riwayat untuk menghindari duplikat atau perintah tertentu, tetapi sebelum mengkonfigurasi semua itu, saya ingin memastikan itu adalah cara terbaik.


7
untuk perintah sehari-hari, aliasmungkin lebih bermanfaat. misalnya. alias gfc="git fetch origin"
number5

Jawaban:


20

Saya menemukan sangat berguna perintah readline berikut

history-search-backward,
history-search-forward

(sadar mereka berbeda dari yang biasa reverse-search-history, forward-search-history, terikat Ctrl- R, Ctrl- S).

Saya memiliki perintah ini terkait dengan Ctrl- Updan Ctrl- Downmenempatkan baris berikut ke dalam ~/.inputrc:

"\e[1;5A": history-search-backward
"\e[1;5B": history-search-forward

Cara kerjanya: tulis beberapa karakter awal perintah, tekan Ctrl- Updan perintah lama berikutnya yang diawali dengan awalan itu akan ditampilkan, tekan lagi untuk melihat yang berikutnya, dan seterusnya. Ketika Anda puas, setelah mungkin memodifikasi perintah, tekan Enteruntuk mengeksekusi.


1
+1 untuk ini, saya melakukan hal yang sama meskipun saya hanya mengikatnya ke tombol Panah Atas dan Panah Bawah (tanpa pengubah CTRL), yang berfungsi untuk saya. Jika Anda ingin melakukan hal yang sama seperti yang Anda butuhkan adalah "\e[B": history-search-forwarddan"\e[A": history-search-backward
Simon Whitaker

Juga pertimbangkan untuk tumbuh HISTFILESIZEdan / atau HISTSIZE(mendukung zsh saja HISTSIZE, bash mendukung keduanya) untuk memastikan buffer Anda cukup besar. Pertanyaan SO bash HISTSIZE vs HISTFILESIZE? dapat menerangi lebih lanjut.
Adam Katz

56

Kiat lain: Saya terkadang menggunakan komentar untuk menandai / memberi tanda pada sebuah perintah:

my_command #bookmark

kemudian:

[ctrl-r]#bookmark

menyukainya! - bagus.
Greg

17
Bashtags! Jenius. :-)
Simon Whitaker

Sangat bagus! Saya akan menggunakan ini untuk mysql-cli saya juga :)
Konerak

Itu luar biasa! Sayangnya, zshell tidak memperlakukan # sebagai awal komentar dalam sesi interaktif. Tahu trik serupa untuk itu?
Nathan Long

1
@NathanLong: $_bookmark. Dapat dikatakan bahwa ini adalah peretasan mengerikan yang mengeksploitasi fakta bahwa tidak ada variabel yang berkembang menjadi tidak ada, tetapi tentu saja berhasil, dengan peringatan bahwa spasi tidak diizinkan (gunakan _sebagai gantinya).
kampu

7

Meskipun cakupannya sangat terbatas, saya ingin menunjukkan dua penampung ekspansi ini:

!! 

adalah ekspansi placeholder untuk perintah terakhir. Berguna jika Anda lupa untuk meletakkan sudosebelum perintah.

!$ 

mengulangi parameter terakhir. Berguna jika Anda ingin mengulangi perintah yang berbeda dengannyaa/very/long/path/name/you/do/not/want/to/type/again


Ya, tip yang bagus ... kalau saja saya ingat untuk menggunakannya :)
Jeach

6

Gunakan 'alias'

alias adalah alat yang bagus untuk ini.

  • Anda dapat dengan mudah mendeklarasikan satu di baris perintah untuk digunakan selama sesi shell saat ini.
  • Jika Anda akan menggunakannya di masa mendatang, Anda dapat menambahkannya ke konfigurasi shell Anda.

Saat Anda menggunakan alias, persis seperti Anda mengetiknya, jadi cukup fleksibel. Misalnya, Anda dapat menggunakannya dengan pipa:

alias findfoo="grep 'foo'"
echo 'foo1 \n foo2 \n bar1 \n bar2 \n foo3' | findfoo # Does your custom grep

Anda harus dapat melakukan "sedikit variasi" dengan melewati setiap flag yang belum Anda tentukan.

echo 'foo1 \n foo2 \n bar1 \n bar2 \n foo3' | findfoo -v # finds non-matches

5

Saya membuat skrip shell minimal untuk perintah saya yang sering dan memberi mereka nama pendek. Mereka semua disimpan di tempat yang sama, yang ditambahkan PATH.

Dengan begitu saya memiliki akses pintas ke perintah yang sangat kompleks, dan tidak seperti dengan aliassaya dapat mengubah bagian tugas saya yang berubah menjadi argumen baris perintah pintas saya.


3
Jika Anda hanya ingin memberikan argumen, pertimbangkan untuk mendefinisikan fungsi. Jika Anda memerlukan skrip lengkap, ini adalah solusi yang bagus :)
Konerak

@Konerak saya harus mencobanya. Saya biasanya hanya membuat skrip, tetapi mendefinisikan fungsi akan jauh lebih bersih, saya yakin.
ixtmixilix

4

Saya menyimpan salinan .bash_history di Git . Untuk menyederhanakan ini, saya telah mengatur

# don't put duplicate lines in the history
# don't save commands which start with a space
HISTCONTROL=ignoredups:erasedups:ignorespace

# append to the history file, don't overwrite it
shopt -s histappend

di .bashrc , dan perintah berikut (dimodifikasi untuk penggunaan umum) dalam skrip pembersihan

# Ensure a single space at the end of each line to easier add more parameters
sed -i -e 's/ *$/ /' "~/.bash_history"

sort --unique --output="~/.bash_history" "~/.bash_history"

yang saya jalankan sebelum menambahkan baris git gui. Karena file histori dimodifikasi dengan setiap perintah, saya juga punya perintah khusus untuk memperbarui repositori tertentu:

git stash && git pull && git stash pop

+1 terutama untuk menyebutkan HISTCONTROL=ignorespace, yang penting untuk tidak mengacaukan sejarah, kadang-kadang.
quodlibetor

2

Di antara semua jawaban lain di sini yang melibatkan sejarah.

aku menyiapkan

HISTFILESIZE=2024
HISTSIZE=1024

di ~ / .bash_profile

Selain komentar lainnya ulang: sejarah

Fitur bermanfaat lainnya ...

Memulai pengingatan sejarah dengan

!first few letters<ESC>Ctrl-E

akan mengingat perintah terakhir yang dimulai dengan beberapa huruf pertama

misalnya:

!find<ESC>Ctrl-E

Anda tidak menyebutkan apakah Anda menggunakan GUI, atau hanya baris perintah. Jika Anda menggunakan GUI, Anda dapat menggunakan salah satu pengelola papan klip yang terus-menerus untuk menyalin / menempel perintah yang biasa digunakan, userid, kata sandi, url, dll.


Wow, !find<ESC>CTRL-Eberhasil, tapi saya ragu saya akan bisa mengingatnya besok. Apa itu ESC CTRL-E?
Konerak

hanya mengikat ke kunci yang diperluas
bsd

0

Belajar menggunakan Ctrl-Rdan Ctrl-Smemungkinkan untuk dengan mudah mencari perintah yang Anda cari dalam sejarah, dan Anda sudah menemukan variabel lingkungan HISTCONTROL untuk mengabaikan duplikat dan mengubah situs file bash history.

Saya biasanya melakukan banyak Ctrl-Rdiikuti oleh Ctrl-Edan mengubah beberapa parameter, jika saya melewatkan perintah yang ditemukan dengan menekan Ctrl-Rsatu kali terlalu banyak, Ctrl-Suntuk menyelamatkan.


2
Seringkali tty diatur sedemikian rupa sehingga Ctrl-S adalah urutan "berhenti", dan tidak (langsung) tersedia untuk pencarian maju.
enzotib

Dalam kasus seperti ini, pencarian maju dapat dipetakan kembali ke sesuatu selain <kbd> Ctrl-S </kbd>.
Evgeny


0

Selain jawaban yang baik di atas, jika Anda menggunakan gui berdasarkan kde atau gnome, maka AutoKey dapat sangat membantu.

https://code.google.com/p/autokey/

Ini memungkinkan Anda membuat frasa yang dipicu dengan mengetikkan beberapa karakter atau menekan tombol pintas. Frase ini kemudian diganti atau ditambahkan ke input Anda.

Ini juga mendukung skrip yang ditulis dengan python yang dapat Anda lakukan melakukan apa saja jika Anda tahu python. Saya belum tahu python, tapi saya sudah mendapatkan beberapa skrip yang sangat mendasar untuk melakukan hal-hal yang rapi.

Semuanya tampak berasal dari keyboard Anda, sehingga berfungsi dengan aplikasi apa pun yang menerima input keyboard - dan dengan desktop Anda sendiri.

Ini memiliki banyak opsi untuk mengontrol bagaimana dan di mana hal-hal ini diaktifkan, sehingga Anda dapat memiliki beberapa yang hanya berfungsi di konsol Anda dan yang lain hanya bekerja di jendela lain. Anda juga dapat mengatur frasa untuk dijalankan segera setelah Anda mengetik string yang memicu mereka atau menunggu sampai Anda memberi mereka OK.


0

Seperti orang lain katakan alias adalah teman Anda. Untuk hal-hal yang sedikit lebih rumit (ketika Anda membutuhkan argumen di suatu tempat di antara instruksi) saya menggunakan fungsi di .zshrc saya, seperti:

function ff() { find . -iname "*$**" }

yang berfungsi seperti cari (saya menggunakannya ketika karena alasan tertentu db tidak tersedia). Atau

function chuck() { ps aux | grep $1 | tr -s '\t' ' ' | cut -f2 -d' ' | xargs kill $2 }

untuk pengganti killall.


0

Selain menggunakan Cntl-Runtuk melihat kembali di .bash_history, saya juga memiliki file README di ~/developdirektori di mana saya meletakkan perintah panjang seperti untuk git/ svn, jadi saya bisa kembali lagi nanti ketika saya perlu. Demikian pula, saya berencana memiliki ~/install/READMEfile untuk meletakkan semua nama paket umum yang biasanya saya instal setelah menginstal versi baru Linux / Ubuntu. Jadi idenya adalah untuk memiliki file README di dalam setiap direktori, misalnya Video, Audio, ... dan memasukkannya perintah / tips umum, yang mungkin perlu Anda ketahui di lain waktu.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.