Komutu geçmişte tutmadan yürütün [kapalı]


204

Bazı komutları yürütmek istiyorum ancak komut geçmişinde saklamak istemiyorum. Böylece kimse .bash_historydosyayı dosyada arayamaz.

Bash komutlarını bu şekilde yürütmenin bir yolu var mı?


13
Bu soru, "sunucu yöneticisi" kadar "programlama" olmadığı için muhtemelen ServerFault'a taşınmalıdır - ancak soru / cevap için teşekkürler, tam olarak ihtiyacım olan şey!
Andrew Theken

Yanıtlar:


296

Komutunuzu bir boşlukla başlatın, geçmişe dahil edilmeyecektir.

Bunun ortam değişkeninin $HISTCONTROLayarlanmasını gerektirdiğini unutmayın .

  • Aşağıdaki komutun döndüğünden emin olun ignorespaceveya ignoreboth

    #> echo $HISTCONTROL
  • Eksikse ortam değişkenini eklemek için, bash profiline aşağıdaki satır eklenebilir. Örneğin%HOME/.bashrc

    export HISTCONTROL=ignorespace

Profile yeniden kaynak sağlandıktan sonra, alan ön ekli komutların üzerine yazılamaz $HISTFILE


20
Bu, çoğu sistemde büyük olasılıkla varsayılan olsa da, göz ardı alanı $ HISTCONTROL'e dahil edilmedikçe çalışmaz.
pgl

2
Doğru. Daha fazla ayrıntı için OP bash man sayfasındaki HISTCONTROL ve HISTIGNORE'a bakmalıdır.
u-punkt

2
thegeekstuff.com/2008/08/… - tarihe ait komutları gizleme yöntemi de dahil olmak üzere daha fazla bash geçmişi ipucu bulabilirsiniz
user379997 12:11

52

Herhangi bir Bash oturumunda, aşağıdakileri yazarak geçmiş dosyasını / dev / null olarak ayarlayın.

export HISTFILE=/dev/null

Yorumlarda belirtildiği gibi, bunun o oturumda tarihe herhangi bir komut yazmayacağını unutmayın!

Sadece sistem yöneticinizin sıkı çalışmasıyla uğraşmayın, lütfen;)

Doodad'ın çözümü daha zariftir. Sadece değişkenin ayarını kaldırın: unset HISTFILE(teşekkürler!)


5
Bu, tüm komutların günlüğe kaydedilmesini önleyecektir . Soru soran bu değil.
Noufal Ibrahim

12
Bu /dev/null, çıkışta 0600 olarak ayarlanan izinlerle ilgili sorunlara neden oldu . Bunun yerine kullandım unset HISTFILE.
Doodad


21

@John Doe & @ user3270492'nin cevabının bir uzantısı. Ama bu benim için işe yarıyor gibi görünüyor.

<your_secret_command>; history -d $((HISTCMD-1))

Komutun geçmişinizde girişini görmemelisiniz.

İşte açıklama ..

'Tarih -d' adı geçen girdiyi geçmişten siler.

HISTCMD, daha sonra yürütülecek komutun komut numarasını kaydeder. Yani, (HISTCMD-1) son yürütülen komutu ifade eder.

Bash geçmiş dosyasından belirli bir satırı kaldırma


Ne yazık ki bu benim için işe yaramadı.
Magick

10

Tarihsiz bir kabuk kullanmayı düşünebilirsiniz, örneğin

/bin/sh << END
   your commands without history
END

(belki de /bin/dashya da /bin/sashdaha fazla uygun olabilir /bin/sh)

veya toplu iş yardımcı programını daha iyi kullanın;

batch << EOB
   your commands
EOB

Tarih o zaman çok anlamlı olmayan shya batchda içermez


8

Oturumunuza aşağıdakilerle başlayabilirsiniz:

export HISTFILE=/dev/null ;history -d $(history 1)

sonra sinsi işlerinle devam et. HISTFILE Ayarlama için /dev/nullgeçmiş dosyasına kaydedilir, henüz bu girişin kolaylıkla silinecek ve (geçmiş dosyasında en azından) izi gösterilecektir.

Ayrıca, bu kalıcı değildir.


Bu zaten birçok kez cevaplandı. Cevabınızın bu konuya eklediğini söyler misiniz (işe yaramaz gürültü hariç)?
gniourf_gniourf

O değildi tek cevap araya böylece kendisi geçmişinde görünmesini komutu yok etmek, ve bu daha sonra girilir kadar şey şovu olmayan.
Christian

1
Ama şimdi bu konu gerçek bir karmaşa! Bu durumda, özellikle böyle eski bir soru için, zaten mevcut iyi cevapları düzenlemek ve / veya bir yorum bırakmak daha iyi olduğuna inanıyorum…
gniourf_gniourf

5

Doodad tarafından yorumlarda belirtildiği gibi , unset HISTFILEbunu güzel bir şekilde yapar, ancak bazı geçmişleri de silmek istiyorsanız echo $HISTFILE, geçmiş dosyası konumunu (genellikle ~/.bash_history) almak unset HISTFILEve düzenlemek ~/.bash_history(veya ne olursa olsun HISTFILE- elbette şimdi unsetyapabilirsiniz ' t okuyun).

$ echo $HISTFILE       # E.g. ~/.bash_history
$ unset HISTFILE
$ vi ~/.bash_history   # Or your preferred editor

Sonra geçmişinizi ve onu düzenlediğiniz gerçeğini düzenlediniz!


Bunu denedim: GNU bash, sürüm 3.2.57 (1) -çalışma (x86_64-apple-darwin15) ve işe yaramıyor. Belirlenmemiş GEÇMİŞ'ten sonra kullandığım komutlar ~ / .bash_history
Krystian

@Krystian Benim hatam - "unset HISTFILE" olması gerektiği zaman "unset HISTORY" yazmıştım - düzeltildi. Şu anda çalışıyor mu? GNU bash, sürüm 4.3.30 (1) -çalışma (x86_64-pc-linux-gnu) üzerinde çalışır.
drkvogel

emin değilim. Basit test: unset HISTFILE; echo TEST; historysize echo TESTsondan bir önceki gibi komut verecektir . Her ne kadar oturumu sonlandırıp tekrar bağlandıktan sonra, tarih gerçekten bu girişe sahip değildir. Bu yüzden işe yaradığını söyleyebilirim :)
Krystian

unset HISTFILEkomutların bellekte geçmişte kaydedilmesini durdurmuyor gibi görünmektedir, ancak $ HISTFILE dosyasının hangi dosyaya kaydedildiğini durdurmaz. Bu yüzden sanırım yerel geçmişiniz hala bellekte, ancak artık bir dosyaya kaydedilmiyor, bu da isteyebilirsiniz! ;)
drkvogel

4

Aşağıdaki komutu da kullanabilirsiniz:

echo toto; history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')

Bence bu çok taşınabilir bir komut.


Bundan takma ad oluşturdum: alias forget="history -d $(history | sed -n '$s/\s*\([0-9]*\)\s*.*$/\1/p')"ve şimdi böyle bir şey yapabilirsiniz:mysql -uroot -pSecretPassword ; forget
sobi3ch

1
Üzgünüz, ama tırnak işaretleri $ssed ve başka şeyler değiştirmek için takma ad yerine işlev oluşturmanız gerektiğini anlıyorum . function forget() { // put code here // }
sobi3ch

3

Eğer zsh kullanıyorsanız çalıştırabilirsiniz:

setopt histignorespace

Bu ayarlandıktan sonra, boşlukla başlayan her komut geçmişin dışında bırakılır.

Sen kullanabilirsiniz takma adları içinde .zshrcbu açmak için açma / kapama :

# Toggle ignore-space. Useful when entering passwords.
alias history-ignore-space-on='\
setopt hist_ignore_space;\
echo "Commands starting with space are now EXCLUDED from history."'

alias history-ignore-space-off='\
unsetopt hist_ignore_space;\
echo "Commands starting with space are now ADDED to history."'

Güzel, ama bu soru özellikle etiketli bash
tripleee

2

Bunu başarmanın birkaç yolu vardır. Bu, geçmiş dosyasının boyutunu 0 olarak ayarlar:

export HISTFILESIZE=0

Bu, geçmiş dosyasını /dev/nulletkin bir şekilde devre dışı bırakacak şekilde ayarlar :

export HISTFILE=/dev/null

Tek tek komutlar için, komutun önüne bir boşluk ekleyebilirsiniz, bu komut geçmiş dosyasına kaydedilmez. Bunun ignorespaceiçin $HISTCONTROLortam değişkenine dahil edilen değere sahip olmanız gerektiğini unutmayın (man bash ve ignorespacedaha fazla ayrıntı için arama yapın ).


2
Bu, tüm komutların günlüğe kaydedilmesini önleyecektir . Soru soran bu değil.
Noufal Ibrahim

Sorgulayıcının, günlüğe kaydedilmemesi gereken her şeyi yaptıktan sonra değerleri sıfırlayacağını varsaydım.
pgl

1

Bu, tüm tarihi silmek de dahil olmak üzere tüm tarihi silmek istiyorsanız kullanışlıdır!

rm .bash_history;export HISTFILE=/dev/null;exit

1

Sadece koşmanız gerekiyor:
$ set +o history

Daha fazlasını görmek için şunu çalıştırın:
$ man set


2
Bu, geçmişi tek bir komut için değil, gelecekteki tüm komutlar için devre dışı bırakır. Buraya gelen çoğu kişi bunun yerine kabul edilen cevaba bakmalıdır.
üçlü

Bu geçerli veya tamam ama eksik. set -x historySonradan ters komutu eklediğimiz sürece çalışır.
Abdillah

0

Bu komut kullanışlı olabilir. Bu, yürütülen komutu kaydetmez

history -d $((HISTCMD-1)) && <Your Command Here>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.