
Ich hätte gerne einen Befehl oder ein Skript, dasöffnet ein neues Gnome-Terminalfenster mit Bash, lädt eine Verlaufsdatei und bleibt geöffnet.
Ich habe nach einer Möglichkeit gesucht, ein Terminal zu öffnen und einen Befehl auszuführen, ohne es zu schließen. Die Antworten, die ich gefunden habe, sind im Wesentlichen zusammengefasst indiese Stackoverflow-Antwort.
Basierend auf diesen Methoden habe ich versucht, den folgenden Befehl auszuführen:
gnome-terminal -e "bash -c 'history -r ~/history.txt; exec $SHELL'"
Allerdings ist der Verlauf, der im neuen Fenster angezeigt wird, nicht der in , history.txt
sondern der in der Standarddatei .bash_history
. Ich dachte, da nach dem history -r
von mir ausgeführten Befehl bash
, der die .bashrc
Datei als Quelle verwendet, vielleicht .bashrc
etwas passiert, das den von mir geladenen Verlauf beeinflusst.
Darauf basierend habe ich die rcfile
Option in der oben verlinkten Antwort ausprobiert, sodass ich nach Befehle einfügen kann .bashrc
, was zu folgendem Ergebnis führte rcfile
:
FILE=~/.bashrc && test -f $FILE && source $FILE
history -c && history -r ~/history.txt
Wenn ich jedoch den folgenden Befehl ausführe:
gnome-terminal -e "bash --rcfile rcfile"
Der Verlauf im neuen Terminal ist immer noch der von .bash_history
. Wenn ich den history
Befehl zum hinzufüge rcfile
, wird angezeigt, dass der Verlauf von history.txt
geladen wurde.etwas danach rcfile
überschreibt den Verlauf, den ich lade.
Ich habe auch festgestellt, dass wenn ichsetze die HISTFILE
Variable zurückmit export HISTFILE=''
am Ende des rcfile
,der Verlauf von history.txt
wird nicht überschriebenund funktioniert. Ich möchte es jedoch nicht aufheben, HISTFILE
da ich möchte, dass der Verlauf gespeichert wird, .bash_history
wenn ich das neu geöffnete Terminal verwende.
Schließlich habe ich die -o
Option in Bash gefunden und versucht, damit das zu machen, was ich wollte. Ich habe sie geändert rcfile
in:
FILE=~/.bashrc && test -f $FILE && source $FILE
history -c && history -r ~/saved/history.txt
set -o history
und führte den folgenden Befehl aus:
bash --rcfile rcfile.txt +o history
Ich hatte gehofft, dass die Ausführung bash
mit das Überschreiben +o history
des Verlaufs von verhindern würde , während der Befehl in den den Bash-Verlauf reaktivieren würde. Dies funktioniert jedoch auch nicht wie beabsichtigt, da der Verlauf der von ist, dann aber keine Verlaufsprotokollierung mehr erfolgt und ich ihn manuell eingeben muss, damit es funktioniert.history.txt
set -o history
rcfile
history.txt
set -o history
Im Grunde führt mich alles, was ich versucht habe, immer wieder zur gleichen Frage:wie öffne ich das neue Terminal mit Bash undDanneinen Befehl ausführen, als ob ein Benutzer es eingeben würde?
Darüber hinaus möchte ich ein besseres Verständnis vonwas passiert, nachdem das rcfile
ausgeführt wird, da ich keine andere relevante Datei finden konnte, die als Quelle verwendet wurde. UndGibt es eine Möglichkeit, dieses Verhalten über die Befehlszeile zu deaktivieren??
Antwort1
Ich habe einen Workaround gefunden, indem ich die PROMPT_COMMAND
Variable und die rcfile.txt
Datei verwendet habe, die in der Frage erwähnt wurden. Sie können den Befehl ausführen
gnome-terminal -e "bash --rcfile rcfile.txt"
rcfile.txt
Dabei handelt es sich um folgende Inhalte :
FILE=~/.bashrc && test -f $FILE && source $FILE
my_init_func() {
# Insert desired commands here. In my case, history -r history.txt
PROMPT_COMMAND=`echo $1`
eval $PROMPT_COMMAND
unset -f $FUNCNAME
}
PROMPT_COMMAND="my_init_func \'$PROMPT_COMMAND\'"
Dadurch wird die Standardquelle (sofern vorhanden) verwendet, .bashrc
um alle anderen Terminalkonfigurationen beizubehalten. Anschließend wird eine Funktion definiert, die einmal ausgeführt wird, wenn die PROMPT_COMMAND
in Bash verwendete Funktion aufgerufen wird. Anschließend wird sie aufgehoben und die ursprüngliche Funktion wiederhergestellt PROMPT_COMMAND
.