Hindari untuk menjaga perintah dalam sejarah

33

Saya menggunakan bash dan saya ingin menghindari beberapa perintah yang disimpan dalam sejarah.

  • Apakah mungkin melakukan itu hanya untuk perintah selanjutnya?
  • Apakah mungkin melakukan itu untuk seluruh sesi?
Luc M
sumber
Perhatikan bahwa jika tujuannya adalah untuk menyembunyikan kata sandi dalam argumen baris perintah, mereka akan tetap terlihat melalui ps
Benitok

Jawaban:

36

dan saya baru ingat jawaban lain, ini adalah jawaban aktual untuk pertanyaan Anda.

jika Anda memiliki "ignorespace" di HISTCONTROL, maka bash tidak akan ingat baris yang dimulai dengan karakter spasi. itu tidak akan muncul bahkan dalam sejarah shell saat ini, apalagi disimpan ke $ HISTFILE.

misalnya saya telah mengekspor HISTCONTROL = 'ignoreboth: erasedups' di my ~ / .bashrc

inilah detail dari halaman bash man:

HISTCONTROL
  Daftar nilai yang dipisahkan oleh titik dua yang mengendalikan bagaimana perintah
  disimpan di daftar riwayat. Jika daftar nilai termasuk
  abaikan, garis yang dimulai dengan karakter spasi tidak
  disimpan dalam daftar riwayat. Nilai ignoredups menyebabkan garis
  cocok dengan entri riwayat sebelumnya untuk tidak disimpan. Nilai dari
  ignoreboth adalah kependekan dari ignorespace dan ignoredups. Nilai
  dari erasedup menyebabkan semua baris sebelumnya cocok dengan baris saat ini
  untuk dihapus dari daftar riwayat sebelum baris itu disimpan.
  Nilai apa pun yang tidak ada dalam daftar di atas diabaikan. Jika HISTCONTROL adalah
  tidak disetel, atau tidak menyertakan nilai yang valid, semua baris dibaca oleh
  parser shell disimpan pada daftar history, tergantung nilainya
  dari HISTIGNORE. Baris kedua dan selanjutnya dari multi-line
  perintah majemuk tidak diuji, dan ditambahkan ke sejarah
  terlepas dari nilai HISTCONTROL.
cas
sumber
1
+1 untuk trik ruang: D
petrus
19

Berikut adalah beberapa pelajaran sejarah yang saya pelajari dari googling:

Anda dapat mengatur riwayat untuk mengabaikan string tertentu. Dalam contoh ini, saya telah mengabaikan perintah ls, passwd dan perintah apa pun yang diawali oleh spasi karakter.

export HISTIGNORE = "ls: passwd:"

Untuk menonaktifkan riwayat untuk sesi Anda, Anda dapat mengeluarkan:

ekspor HISTSIZE = 0

Referensi

Michael Havas
sumber
7

Jika Anda hanya ingin menghapus perintah terakhir dari histori, maka Anda dapat menekan Up-arrow, diikuti oleh Ctrl - U(hapus ke awal baris), lalu Up-arrowlagi.

Anda dapat menghapus setiap baris dari riwayat seperti ini. Cukup gunakan panah atas atau cari atau apa pun untuk menjadikannya baris perintah saat ini sedang diedit, lalu tekan Ctrl - U, dan kemudian Up-arrowatau Down-arrowuntuk pindah ke baris sejarah lain.

Saya menemukan ini secara tidak sengaja hari yang lalu. Saya tidak tahu apakah itu didokumentasikan atau tidak.

Namun, secara umum, tidak terlalu merepotkan untuk tidak menyimpan riwayat shell saat ini sama sekali dengan:

HISTFILE=/dev/null
cas
sumber
3

Anda dapat menghapus HISTFILEvariabel. Dari man bash:

  SEJARAH
         Nama file di mana sejarah perintah disimpan (lihat HIS-
         TORY di bawah). Nilai standarnya adalah ~ / .bash_history. Jika tidak disetel,
         sejarah perintah tidak disimpan ketika shell interaktif
         keluar.

Saya tidak berpikir ini mencegah perintah muncul di riwayat shell lokal sebelum shell keluar.

Greg Hewgill
sumber
2

Saya terkadang melakukannya

export HISTFILE=/dev/null
Rory
sumber
1

Saya melihat bahwa tidak ada yang menulis metode ini, jadi saya akan melakukannya.

history -d $((HISTCMD-1)) && history -d <command or number of command>

history -d menghapus entri yang disebutkan dari riwayat.

HISTCMDmenyimpan jumlah perintah dari perintah yang akan dieksekusi selanjutnya. Jadi, (HISTCMD-1) mengacu pada perintah yang dieksekusi terakhir.

Saya membuat film bash pendek yang menunjukkan cara kerjanya: https://asciinema.org/a/dtxpuovhty0obhln50soqypt2

Setelah menjalankan perintah dan karena itu juga menghapus perintah itu sendiri maka naik dengan panah tidak akan menampilkan perintah, jadi jika Anda berencana sering menggunakan itu, yang terbaik adalah membuat alias:

alias hc='history -d $((HISTCMD-1)) && history -d $1'

Maka Anda dapat melakukan:

$ hc command
Itai Ganot
sumber