So erhalten Sie einen gemeinsamen Bashed-Verlauf zwischen verschiedenen Registerkarten


19

Ich habe die Antwort in /unix//a/1292/41729 verwendet , um die gemeinsame Echtzeithistorie zwischen verschiedenen Bash-Terminals zu aktivieren. Wie in der obigen Antwort erläutert, wird dies erreicht, indem Folgendes hinzugefügt wird:

# 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"

Dies funktioniert einwandfrei, wenn die Bash-Shells separat sind (z. B. Öffnen verschiedener Bash-Terminals mit CTRL+ALT+T. Wenn ich jedoch tabs(von einem offenen Terminal aus) STRG + UMSCHALT + T verwende, funktioniert dies nicht . Warum dieser Unterschied im Verhalten? Wie Kann ich den Bash-Verlauf auch auf verschiedenen Registerkarten teilen?

UPDATE: Ich habe ein ungewöhnliches Verhalten festgestellt: Wenn ich tippe, CTRL+Cwird der letzte Befehl, der in einem der anderen Terminals eingegeben wurde (sowohl ein Tabulator als auch nicht), korrekt angezeigt. Es ist so, als ob STRG + C ein Löschen des Verlaufs erzwingt, damit er korrekt geteilt wird.

Als Beispiel die Ausgänge (T1 bezeichnet Klemme 1 und T2 Klemme 2):

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

Hoffe das kann keinen Hinweis geben!


Sie haben das zu Ihrer ~.bashrcDatei hinzugefügt ? Nebenbei bemerkt, das Exportieren dieser Variablen ist sinnlos. verschwendet nur Platz in der Umwelt.
Geirha

@geirha Ja, ich habe zu meiner .bashrc-Datei hinzugefügt. Danke für den Kommentar zum Export.
Lucaceron

Antworten:


2

Es sieht so aus, als würden Sie versuchen, auf den Verlauf des anderen Terminals zuzugreifen, bevor die Synchronisierung stattfindet. PROMPT_COMMANDwird ausgeführt, unmittelbar bevor eine neue Eingabeaufforderung gedruckt wird, dh nachdem Sie einen Befehl ausgeführt und bevor Sie den nächsten Befehl eingeben. Also wird es in T1 nicht sofort passieren; Sie müssen dafür sorgen, dass eine neue Eingabeaufforderung angezeigt wird.

Um dies zu testen, probieren Sie diese Variante in Ihren Schritten aus (ich habe ein Extra <enter>in T1 hinzugefügt ):

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)

Mit diesem zusätzlichen Drücken der Eingabetaste erhalten Sie eine neue Eingabeaufforderung, die PROMPT_COMMANDIhren Verlauf ausführt und synchronisiert. Daher würde ich erwarten, dass dieser Aufwärtspfeil den cdanstelle des abruftls , wie Sie es wollten. Leider gibt es meines Erachtens keine Möglichkeit, die Synchronisierung in allen Terminals sofort auszuführen, ohne Befehle auszuführen, wie Sie es zu wollen scheinen. effektiv würde dies erfordern, dass alle Ihre Anmeldesitzungen ihre Verlaufslisten ständig synchronisieren, was eine enorme Verschwendung von CPU- und Festplattendurchsatz wäre.


Wenn Sie Recht haben, drücken Sie die Eingabetaste, um die Synchronisierung zu starten. Auch wenn es eine Verschwendung von Speicher oder CPU gibt, wie könnte ich die Synchronisierung erzwingen? (Wenn es zu viel ist, kann ich es immer deaktivieren, aber ich würde es gerne versuchen)
Lucacerone

1

Ich habe die gleiche Frage gestellt und hier ist die Antwort, die ich mir ausgedacht habe ...

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


Bevor ich es versuche, zwei Probleme: Soll ich dann die anderen Hystory-Optionen entfernen? das geht in .bashrc oder?
Lucacerone

Leider funktioniert es nicht ...
Lucacerone

Bei jeder HISTFILESIZEÄnderung wird automatisch versucht, die vorhandene Verlaufsdatei zu kürzen. Änderungen HISTSIZEhaben ähnliche Auswirkungen auf die aktuelle Historie. Zum Nachschlagen siehe den Kommentar variables.cin der Bash-Quellcodierung kurz zuvor sv_histsize.
Brian Vandenberg

1

Fügen Sie diese Zeilen zu Ihrer .bashrcDatei hinzu

# 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"

Hinweis:

Anfänglich habe ich in meinem Testfeld das USR1-Signal gesendet, um mit killall zu schlagen. Später habe ich mir überlegt, einen eindeutigen Shell-Namen zu verwenden, eine Bash-Kopie mit dem Namen testshell, um zu vermeiden, dass meine eigenen Shells getötet werden, die ausgeführt werden könnten (z. B. Cron-Prozesse) Arbeiten.

Das Killall war nicht selektiv genug, ich ersetzte es durch ein Skript, das nur die Bash-Prozesse bis auf ein Tty (ps a meldet nur Prozesse, die an eine Tty gebunden sind).

Vergessen Sie nicht, Ihre Sitzung neu zu starten, um einen neuen PROMPT_COMMAND zu erhalten. Während des Tests wurden viele meiner vorherigen Tests in PROMPT_COMMAND gestapelt.


Sie brauchen den neuen Benutzer und die andere Shell nicht, Sie können nur anweisen killall, das Signal nur an Prozesse desselben Benutzers mit einem zusätzlichen -uArgument , e.g. -u $ (whoami) ` zu senden .
Philipp Wendler

Ich denke die Syntax für csh ist falsch ... @PhilippWendler könntest du bitte ein bisschen näher darauf eingehen?
Lucacerone

Die Frage ist über Bash, also habe ich Bash-Syntax verwendet. Ich weiß nicht, csh. killall -q -USR1 -u $(whoami) bashSendet für Bash das USR1-Signal an alle Bash-Prozesse des aktuellen Benutzers.
Philipp Wendler

@Philipp Übrigens habe ich die dedizierte Shell-Lösung nicht getestet. Es sollte ein Fall behoben werden, in dem Cron-Bash-Skript ausgeführt werden würde.
Emmanuel

@LucaCerone ich umgeschrieben scheint zu funktionieren
Emmanuel

0

Ich hatte das seltsame Verhalten in Yakuake, als ich versuchte, eine ausgefeilte Bash-Eingabeaufforderung zu erstellen, in der die Anzahl der weiteren Anmeldungen angezeigt wurde. Die Anzahl der Tabs wurde nicht erhöht. Mein Workaround bestand darin, Yakuake bashin jedem neuen Tab erneut zu starten und Bash in Bash zu starten. Es begann einwandfrei zu funktionieren. Vielleicht würde es Ihnen auch helfen. Meine blinde Vermutung ist, dass sich die grafische Benutzeroberfläche für das Laden der Bash-Konfiguration von selbst lädt und diese dann an Bash-Instanzen weiterleitet. Vielleicht liegt es daran, mit ihnen herumspielen zu können.


Ich habe versucht, Bash in Bash zu laden, aber ohne Erfolg :(
Lucacerone
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.