Apakah ada cara untuk menjaga agar perintah tidak ditambahkan ke riwayat Anda?

65

Apakah ada cara untuk menjaga agar perintah tidak ditambahkan ke riwayat Anda? Saya memiliki perintah yang ingin saya hindari dari file histori saya, dan saya benar-benar tidak peduli untuk memilikinya di sana ketika saya mencari histori yang tersimpan dalam memori, meskipun itu kurang menjadi perhatian. Apakah ada cara untuk mencegah hal ini, atau apakah saya hanya perlu kembali dan mengedit file histori saya.

pembaruan: Saya tidak menyadari ini mungkin khusus untuk shell. Kulitku zsh. Anda boleh menjawab untuk kerang lain sehingga orang tahu bagaimana melakukan ini di kerang mereka.

xenoterracide
sumber
cross-link ke jawaban zsh: superuser.com/questions/352788/…
Michael Shigorin

Jawaban:

52

Dalam ZSH :

Masukkan pertama setopt HIST_IGNORE_SPACEke ~/.zshrc. Sekarang setelah Anda masuk lagi, Anda bisa mengawali perintah apa pun yang tidak ingin disimpan dalam riwayat dengan a space.

Dari panduan pengguna , 3 opsi berikut dapat digunakan untuk mengatakan bahwa baris tertentu tidak boleh masuk ke riwayat sama sekali:

  • HIST_IGNORE_SPACE jangan menyimpan perintah yang diawali dengan spasi
  • HIST_NO_STORE tidak menyimpan perintah history ( fc -l )
  • HIST_NO_FUNCTIONS tidak menyimpan definisi fungsi
dogbane
sumber
ada kemungkinan @mmckinst jawaban berfungsi di zsh? atau semacamnya? atau mungkin perintah apa pun yang termasuk perintah| somecommand
xenoterracide
AFAIK tidak ada yang setara dengan HISTIGNORE bash di zsh.
dogbane
@xeno zsh menyediakan fungsi kait preexecyang dapat digunakan untuk itu. Jika kembali bukan nol perintah tidak disimpan dalam riwayat.
Keith
1
untuk membuat zsh mengabaikan banyak perintah umum dasar, saya alias mereka semua memiliki ruang di depan ... untuk c (ls fg bg pekerjaan keluar dari reset yang jelas); do alias $ c = "$ c"; selesai
Will Norris
4
Untuk pembaca masa depan yang malas seperti saya yang belum tahu bagaimana melakukannya: setopt HIST_IGNORE_SPACEdi~/.zshrc
Al.G.
25

Jika Anda menjalankan perintah berulang kali, Anda mungkin ingin menggunakan fitur abaikan riwayat shell Anda. Katakanlah Anda memiliki secret.server.com yang Anda ssh, file FTP, dll. Bahwa Anda tidak ingin baris yang menyebutkan secret.server.com disimpan:

Di bashAnda akan mengatur

HISTIGNORE="*secret.server.com*"

sedangkan pada zshparameter disebut

HISTORY_IGNORE="*secret.server.com*"

Anda dapat membuat daftar beberapa pola dengan tanda titik dua yang memisahkannya. Perhatikan bahwa setiap pola dicocokkan dengan jalur input penuh , jadi Anda mungkin perlu memasukkan *. Misalnya, berikut ini akan mengecualikan fortunedari sejarah, tetapi akan menyimpan fortune -l:

HISTIGNORE="*secret.server.com*:ytalk*:fortune"
HISTORY_IGNORE="*secret.server.com*:ytalk*:fortune"

Dengan set HISTIGNORE, tidak ada yang cocok dengan pola daftar Anda akan disimpan ke .bash_history/ .zsh_historydan bahkan tombol panah atas, yang biasanya mengingat perintah sebelumnya, tidak akan berfungsi jika cocok dengan pola Anda.

Mark McKinstry
sumber
3
ada kemungkinan ini bekerja di zsh?
xenoterracide
Apakah ada opsi untuk mengabaikan hanya garis yang dimulai dengan keberuntungan. Sesuatu yang ingin HISTIGNORE="^fortune*"diabaikan fortune -ltetapi tetap myfortune?
Bernhard
@ xenoterracide Ya, tapi parameternya dinamai berbeda. Saya baru saja mengeditnya menjadi jawabannya.
n.st
23

Dalam bash, gunakan HISTCONTROLvariabel.

Setel ke HISTCONTROL=ignorespace(atau HISTCONTROL=ignoreboth). Mulai sekarang, ketika Anda memulai garis dengan spasi , itu tidak akan disimpan dalam sejarah. Ini menghindari untuk memasukkan perintah yang tidak boleh diungkapkan dalam beberapa file konfigurasi.

Bahkan seperti itu kebetulan lupa untuk menambah ruang dan kemudian ingin kembali. Untuk menghapus entri dalam riwayat, gunakan history -d <index>, dengan indexnomor yang ditemukan dengan historyperintah (kolom pertama).

shellholic
sumber
1
Apakah ini berhasil zsh?
Gert
11

Cara termudah untuk satu kali adalah

$ $SHELL
$$ unset HISTFILE
$$ secret-command
$$ exit
$

di mana $mewakili prompt shell awal dan $$mewakili prompt subshell. Ini berfungsi dalam bash dan zsh; di ksh yang Anda butuhkan HISTFILE=/notwritablesebagai gantinya. Perhatikan bahwa yang penting adalah nilai HISTFILEkapan file histori ditulis, bukan ketika perintah dijalankan. Bash, ksh dan zsh menulis ke file histori ketika mereka keluar (zsh dapat melakukannya lebih sering tergantung pada konfigurasi).

Atau, Anda bisa mendapatkan bash atau zsh untuk mengabaikan garis yang cocok dengan pola tertentu (ini sudah dicakup oleh jawaban lain).

Kemungkinan lain di zsh adalah

% fc -p
% secret-command
% fc -P

fc -pmendorong daftar riwayat saat ini ke tumpukan dan memulai yang baru yang tidak terkait dengan file simpan. fc -Pmuncul yang belum disimpan daftar sejarah dari tumpukan dan lupa sama sekali.

Ketika sebuah proses sedang berjalan, perintah dan argumennya (dan pada beberapa sistem lingkungannya juga) akan muncul di tabel proses ( psoutput). Root dapat melihat perintah sebelumnya di basis data akuntansi sistem , dan dapat melakukan lebih banyak logging tanpa kendali Anda. Dan mungkin akan ada semua jenis bukti forensik yang dapat menunjukkan kira-kira perintah apa yang Anda jalankan (seperti waktu modifikasi file). Jadi Anda tidak mendapatkan privasi terhadap penyadap yang ditentukan.

Gilles 'SANGAT berhenti menjadi jahat'
sumber