Mac Terminal neden aynı olduklarında art arda iki komutu hatırlıyor?


9

Mac'i son zamanlarda kullanmaya başladım ve Ubuntu'da daha önce çalışmaya başladım.

Bu komutları terminalimde birer birer çalıştırdığımı varsayalım:

python3 main.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py
python3 main2.py

Şimdi koşmak istediğimi varsayalım python main.py tekrar, bu yüzden yukarı tuşunu tıklayacağım. Ubuntu’da sadece iki kez, Mac’te ise 7 kez tıklamam gerekecek.

Eğer iki ardışık komut aynı ise, terminal iki farklı komutu hatırlamak yerine sadece bir komutu hatırlamalıdır.

Bunu macOS'ta nasıl yapabilirim?


6
Sadece bilgiçlik için, bunu yapan aslında mac terminal değil. Bu bash, kabuğun terminalde çalışıyor. Çok sayıda kabuk vardır ve varsayılan kabuğu yerine başka bir şeyle değiştirmek mümkün ve yaygındır. zsh ve hatta dahası zsh özelleştirmek çeşitli komut dosyaları ile.
gman

Yanıtlar:


13

HISTCONTROL ortam değişkenini cihazınıza eklemeniz gerekir. .bash_profile. Senin içinde .bash_profile aşağıdaki satırı ekleyin:

export HISTCONTROL=ignoreboth:erasedups

Kapatıp bash oturumunuzu yeniden başlatın ve dupes gitmiş olmalı. Alternatif olarak, sadece aynı satırı çalıştırabilirsiniz ve bu oturum için etkili olacaktır (test etmek için kullanın).


İtibaren için kılavuz sayfası bash (Terminalde):

HISTCONTROL
Komutların geçmiş listesine komutların nasıl kaydedildiğini kontrol eden, iki noktalardan ayrılmış bir değerler listesi. Eğer değerler listesi içeriyorsa ignorespace , boşluk karakteriyle başlayan çizgiler geçmiş listesine kaydedilmez. Değeri ignoredups önceki geçmiş girişiyle eşleşen satırların kaydedilmemesine neden olur. Değeri ignoreboth'un kısaca ignorespace ve ignoredups . Değeri erasedups Geçerli satırla eşleşen önceki tüm satırların, o satır kaydedilmeden önce geçmiş listesinden kaldırılmasına neden olur. Yukarıdaki listede olmayan herhangi bir değer göz ardı edilir. Eğer HISTCONTROL ayarlanmamışsa veya geçerli bir değer içermiyorsa, kabuk ayrıştırıcı tarafından okunan tüm satırlar, değer listesine bağlı olarak geçmiş listesine kaydedilir. HISTIGNORE . Çok satırlı bir bileşik komutun ikinci ve sonraki satırları test edilmez ve değerinden bağımsız olarak geçmişe eklenir. HISTCONTROL .


4

Bu neden oluyor?

MacOS ve Ubuntu, bash komut geçmişindeki kopyaları işlemek için kutudan farklı şekilde yapılandırılmıştır. Bu yapılandırmalar, "sözde" olarak saklanır. dot-files ". Bunlar ~ / .bash * şeklini alırlar, sistemin geniş / etc / profile yanı sıra. Bu dosyaların tümü beğeninize göre özelleştirilebilir ve bunlar arasında ayrım yapılabilir. etkileşimli kabukları, giriş kabukları, uzak kabukları vb. Bu dosyalar bir özel sipariş ve belirli işlevlere hizmet eder.

MacOS'ta aynı davranış nasıl elde edilir?

Sadece bunu istiyorsanız, "komut satırlarının tam kopyalarını yok sayma" nın tek bir şekilde özelleştirilmesi, Allan'ın cevabı gibi bir şeyle gidebilir, örneğin, bash_profile dosyanıza tek bir tek satır ekleyebilirsiniz. "Doğru yol" yok ama sayısız seçenek yok.

Bu, bash'ınız için sadece kişiselleştirme değilse, bu durumda belki en iyi seçenek değil:

Birkaç başka not:

  • Grafiksel uygulamalarda VEYA sh (veya sh olarak çağrılan bash) olması gereken her şey ~ / .profile içinde olmalıdır.
  • ~ / .bashrc hiçbir şey vermemelidir
  • Sadece oturum açma kabukları için mevcut olması gereken her şey ~ / .profile dosyasına girmelidir.
  • ~ / .Bash_login öğesinin bulunmadığından emin olun.

Bu, işler karmaşıklaştığında İyi bir fikir için yayılmak her biri uzmanlaşmış ve içeriklerinde çok sipariş edilen birden fazla dosyada yapılan özelleştirmeler:

Herşey exports basitleştirilmiş gözetim için kendi dosyalarında bulunabilir.

Kullanıcı dizininizin kökünde bash ile okunan bir dosya oluşturun, örneğin .exports içeren:

# Omit duplicates and commands that begin with a space from history.
export HISTCONTROL='ignoreboth'; 

Bunun "kaynak" olması gerekir, böylece dosya etkileşimli açılışta bash ile okunur:

Kaynak dosyaları
Çok sayıda kabuk yapılandırmanız varsa, bunları birkaç alt dosyaya bölmek ve .bashrc'nizden yüklemek için kaynak yerleşikini kullanmak isteyebilirsiniz:   ekleyerek source ~/.exports ona.

Alternatif olarak, dosyaların yüklenmeden önce var olmalarını sağlamak için

if [ -f ~/.exports ]; then
. ~/.exports
fi

Komuta . ~/.exports kaynak olacak ~/.exports şu anda çalışan kabuk bağlamında.

Bu özellikle takma ad eklemek için kullanışlıdır, ayrı dosya değişiklik yaptığınızda yeniden yüklenmesini kolaylaştırır.


2
Nasıl .exports okumak (kaynaklı)?
fd0

1
@ fd0, Kendi başına, macOS'ta kaynaklanmıyor. Allan'ın cevabı bunu başarmanın uygun bir yoludur.
user3439894

Eğer değeri HISTCONTROL ayarlandı .bashrc ve ~/.bashrc kaynaklı ~/.bash_profile o zaman gerek yok export HISTCONTROL değişken. Hem etkileşimli bir giriş kabuğu hem de etkileşimli bir kabuk değişken kümesine sahip olacaktır.
fd0

@ fd0 Kesinlikle: Eğer . / Anlamadığım takdirde: Demek istediğim, eşzamanlı olarak yayınlanan A / & amp; esp _profile 'i aynı zamanda geri kalanı mümkün olduğunca temiz ve düzenli tutmak, çünkü bu, birçok seçenek / ayarın göz önüne alındığı bir senaryo içindir. Son noktanız yukarıdaki yöntemi 'yanlış' olarak algılayabileceğiniz bir düzeltme eklemek veya düzeltmek için bir öneri midir? Şimdi, yorumunuzu benimki ile Allan'ın arasındaki karmaşıklık düzeyindeki gibi okudum.
LangLangC

1

Her yeni komutu benzersiz şekilde kaydetmek zordur. İlk önce eklemelisin ~/.profile veya benzeri:

HISTCONTROL=erasedups
PROMPT_COMMAND='history -w'

O zaman eklemek gerekir ~/.bash_logout:

history -a
history -w
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.