Farklı sekmeler arasında paylaşılan bashed geçmişi nasıl edinilir


19

Cevabı /unix//a/1292/41729 adresinde ayrı bash terminalleri arasında gerçek zamanlı paylaşılan geçmişi etkinleştirmek için kullandım . Yukarıdaki cevapta açıklandığı gibi, bu ekleyerek elde edilir:

# avoid duplicates..
export HISTCONTROL=ignoredups:erasedups  
# append history entries..
shopt -s histappend

# After each command, save and reload history
export PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"

Bu, bash kabukları ayrıysa (örn CTRL+ALT+T. Farklı bash terminallerini kullanarak açma) işe yarar. Ancak tabsyeni pencereler yerine (CTRL + SHIFT + T açık terminalinden) kullanırsam işe yaramaz . Neden bu davranış farkı? bash geçmişini çeşitli sekmeler arasında da paylaşabilir miyim?

GÜNCELLEME: Alışılmadık bir davranış fark ettim: Eğer CTRL+Cyazarsam, diğer terminallerin herhangi birinde (hem sekme olsun ister olmasın) yazılan son komut doğru şekilde görüntülenir. CTRL + C, geçmişin bir sifonunu zorlarsa, böylece doğru bir şekilde paylaşılır.

Örnek olarak çıkışlar (T1, terminal 1 ve T2 terminal 2'yi gösterir):

T1:
ls -lah <enter>
# the list of files and directory is shown

T2:
cd Documents <enter>

T1:
<up> (i.e. I press the up arrow)
ls -lah #i.e the last command in terminal 1 is shown rather than the last of terminal 2
^C (i.e. I press CTRL+C)
<up>
cd Documents #the last command issued in terminal 2 is correctly displayed

Umarım bu herhangi bir ipucu sunabilir!


Bunu ~.bashrcdosyanıza eklediniz mi? Bir yan notta, bu değişkenleri dışa aktarmak anlamsızdır; sadece çevre alanını boşa harcar.
geirha

@geirha evet .bashrc dosyama ekledim. İhracat hakkındaki yorumunuz için teşekkürler.
lucacerone

Yanıtlar:


2

Senkronizasyon gerçekleşmeden önce diğer terminalin geçmişine erişmeye çalıştığınız anlaşılıyor.PROMPT_COMMANDyeni bir istem yazdırılmadan hemen önce, yani bir komutu çalıştırdıktan sonra ve sonraki komutu yazmadan önce yürütülür. Yani T1'de hemen olmayacak; yeni bir istemin görüntülenmesine neden olmalısınız.

Bunu test etmek için adımlarınızda bu varyantı deneyin ( <enter>T1'e bir ekstra ekledim ):

T1:
ls -lah <enter>
# the list of files and directory is shown

T2:
cd Documents <enter>

T1:
<enter>
<up> (i.e. I press the up arrow)

Bu ekstra enter tuşuna basarak, PROMPT_COMMANDgeçmişinizi çalıştıran ve senkronize eden yeni bir istem alırsınız ve böylece bu yukarı okun istediğiniz gibi cdyerine almasını lsbeklerim. Ne yazık ki, senkronizasyonu istediğiniz gibi herhangi bir komut çalıştırmadan tüm terminallerde anında gerçekleştirmenin bir yolu olduğunu düşünmüyorum; etkin bir şekilde bu, tüm oturumlarınızın her zaman geçmiş listelerini sürekli olarak senkronize etmesini gerektirir, bu da CPU ve disk veriminin büyük bir israfı olacaktır.


haklısınız, enter tuşuna basıldıktan sonra senkronize edilir. ? Bellek veya CPU kaybıdır olsa bile nasıl (çok fazla elimden her zaman devre dışı it ise, ancak bunu bir deneyin vermek istiyorum) Ben senkronizasyon zorlayacağını
lucacerone

1

Ben de aynı soruyu sordum ve işte cevap buldum ....

HISTSIZE=9000
HISTFILESIZE=$HISTSIZE
HISTCONTROL=ignorespace:ignoredups

history() {
  _bash_history_sync
  builtin history "$@"
}

_bash_history_sync() {
  builtin history -a         #1
  HISTFILESIZE=$HISTSIZE     #2
  builtin history -c         #3
  builtin history -r         #4
}

PROMPT_COMMAND=_bash_history_sync


denemeden önce iki açıklama: diğer hystory - seçeneklerini kaldırmalı mıyım? Bu .bashrc'ye gidiyor değil mi?
lucacerone

ne yazık ki işe yaramıyor ...
lucacerone

Her HISTFILESIZEdeğiştirildiğinde otomatik olarak mevcut geçmiş dosyasını kesmeye çalışır. Değişikliğin HISTSIZEmevcut tarih üzerinde benzer bir etkisi vardır. Referans için, daha variables.cönce bash src'deki açıklamaya bakın sv_histsize.
Brian Vandenberg

1

bu satırları .bashrcdosyanıza ekleyin

# avoid duplicates..
export HISTCONTROL=ignoredups:erasedups  
# append history entries..
shopt -s histappend

trap 'history -r' USR1 
export PROMPT_COMMAND="history -a ; history -c; ps a | awk '/ bash$/ {system (\"kill -USR1 \" \$1)}'; $PROMPT_COMMAND"

Not:

Başlangıçta killall ile bash için USR1 sinyali göndererek test alanımı yaptım, daha sonra kendi kabuklarımı çalıştırabilen (örneğin cron süreçleri) önlemek için benzersiz bir kabuk adı, testshell adlı bir bash kopyası kullanmayı düşündüm ama garip bir şekilde Çalışma.

Killall yeterince seçici değildi, onu sadece bash süreçlerini sıkıca öldüren bir senaryo ile değiştirdim (ps a sadece tty'ye bağlı süreçleri rapor ediyor)

Yeni bir PROMPT_COMMAND için oturumunuzu yeniden başlatmayı unutmayın, test ederken önceki testimin çoğunun PROMPT_COMMAND içinde yığılmış olduğunu gördüm.


Yeni kullanıcıya ve diğer kabuğa ihtiyacınız yok, sadece killallaynı kullanıcının işlemlerine ek bir -uargüman olan , e.g. -u $ (whoami) ` ile göndermeyi söyleyebilirsiniz .
Philipp Wendler

Bence csh sözdizimi yanlış ... @PhilippWendler biraz ayrıntılı lütfen?
lucacerone

Soru bash hakkında, bu yüzden bash sözdizimi kullandım. Csh bilmiyorum. Bash için, killall -q -USR1 -u $(whoami) bashgeçerli kullanıcının tüm bash işlemlerine USR1 sinyali gönderir.
Philipp Wendler

@Philipp ty btw Özel kabuk çözümünü test etmedim, cron bash betiğinin çalışacağı bir durumu düzeltmekti.
Emmanuel

Yeniden yazdığım @LucaCerone işe yarıyor gibi görünüyor
Emmanuel

0

Başka bir girişin sayısını gösterecek ayrıntılı bash istemi oluşturmaya çalıştığında Yakuake'de aynı garip davranış vardı. Sekmeler için sayı artmadı. Geçici çözümüm Yakuake'e bashher yeni sekmede tekrar çalışmasını söylemekti . Sorunsuz çalışmaya başladı. Belki sana da yardımcı olur. Benim kör tahminim konsol yükleri için GUI bash kendisini yapılandırır ve sonra bunları bash örneklerine besler. Belki onlarla uğraşmak olabilir.


Ben bash bash yüklemeye çalıştım, ama herhangi bir başarı olmadan :(
lucacerone
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.