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.

Konerak
sumber
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.

enzotib
sumber
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
Chris J
sumber
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

Chiborg
sumber
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
Nathan Long
sumber
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.

David Grellscheid
sumber
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
l0b0
sumber
+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.

bsd
sumber
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.

Evgeny
sumber
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

Saya selalu lebih suka menyimpan perintah yang terakhir digunakan dan hasilnya.

script filename
Balaswamy vaddeman
sumber
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.

Joe
sumber
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.

rkj
sumber
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.

Amr
sumber