Farklı sekmeler arasında paylaşılan bashed geçmişi nasıl alınır?

19

Ayrı bash terminalleri arasında gerçek zamanlı paylaşılan geçmişe olanak tanımak için İşte 'deki yanıtı 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"

Eğer bash kabukları ayrıysa (örneğin CTRL+ALT+T kullanarak farklı bash terminalleri açıyorsa) iyi çalışır. Ancak tabs (açık bir terminalden "CTRL + SHIFT + T) yerine yeni kullanıyorum. Neden bu davranıştaki fark? Bash tarihini çeşitli sekmelerde nasıl paylaşabilirim?

GÜNCELLEME: Alışılmadık bir davranış farkettim: CTRL+C yazıyorsam, diğer terminallerden birinde yazılan son komut (her ikisi de bir sekme olsun veya olmasın) doğru şekilde görüntülenir. CTRL + C, tarihin bir dezavantajını zorlarsa, o zaman doğru bir şekilde paylaşılmış gibi olur.

Ö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 verebilir!

    
sordu lucacerone 23.06.2013 20:25

4 cevap

2

Senkronizasyon gerçekleşmeden önce diğer terminalin geçmişine erişmeye çalışıyormuş gibi görünüyor. Yeni bir komut istemi basılmadan önce PROMPT_COMMAND gerçekleştirilir, yani sonra bir komut çalıştırırsınız ve bir sonraki komutu yazmadan önce. Yani T1'de hemen olmayacak; görüntülenecek yeni bir soruna neden olmalısınız.

Bunu test etmek için, bu varyantı adımlarınızda deneyin (T1'e <enter> 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 fazladan enter tuşuna basarak, PROMPT_COMMAND dosyasını çalıştıran ve geçmişinizi senkronize eden yeni bir komut alırsınız. Bu yüzden, bu yukarı oku istediğiniz gibi cd yerine ls almak için beklerdim . Ne yazık ki, senkronizasyonun tüm terminallerde, istediğiniz gibi herhangi bir komut kullanmadan anlık olarak gerçekleşmesinin bir yolu olduğunu düşünmüyorum; etkin olarak bu, tüm oturum açma oturumlarınızın sürekli olarak tarih listelerini sürekli olarak senkronize etmesini gerektirecektir. Bu, büyük bir CPU ve disk iş akışı kaybı olacaktır.

    
verilen cevap Paul 28.06.2013 22:08
1

Aynı soruyu sordum ve işte geldiğim cevap ...

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

history() {
  _bash_history_sync
  builtin history "[email protected]"
}

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

PROMPT_COMMAND=_bash_history_sync
    
verilen cevap Scott Goodgame 26.06.2013 12:38
1

bu satırları .bashrc dosyanı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, test kulağımı USR1 sinyalini killall ile bash göndermek için yaptım, daha sonra, çalışamayan kabuklarımı öldürmek için (örneğin cron işlemleri) ama tuhaf bir şekilde bir ispatlanmamış kabuk adı, testhell adlı bir bash kopyasını kullanmayı düşündüm. Bu çalışma değildi.

Killall yeterince seçici değildi, ben sadece bir tty'ye sıkı bash süreçlerini öldüren bir betik ile değiştirdim ( ps a raporları yalnızca tty'ye bağlı süreçler)

Yeni bir PROMPT_COMMAND ürününe sahip olmak için oturumunuzu yeniden başlatmayı unutma, test yaparken PROMPT_COMMAND içine yığılmış önceki testimin çoğunu gördüm.

    
verilen cevap Emmanuel 01.07.2013 19:46
0

Yakuake'de, diğer girişlerin sayısını gösteren ayrıntılı bir bash istemi oluşturmaya çalışırken aynı garip davranışa sahiptim. Sekmeler için sayı artmadı. Benim geçici çözümüm, her yeni sekmede Yakuake 'in bash ' sini tekrar çalıştırmasını, esas olarak bash’ta bash’a başlamasını söylemekti. Kusursuz çalışmaya başladı. Bu size de yardımcı olabilir. Kör tahminim, konsol yükleri için GUI'nin bash kendini yapılandırması ve daha sonra bunları bash örneklerine beslemesidir. Onlarla keman edebilmek olabilir.

    
verilen cevap Barafu Albino 26.06.2013 12:41

Etiketlerdeki diğer soruları oku