Gibt es eine Möglichkeit, PS1
, PS2
usw. innerhalb eines Bash-Skripts auszuwerten?
Obwohl ich alternative Methoden verwenden kann, um alle Elemente meiner aktuellen PS1
zu erhalten, würde ich wirklich gerne in der Lage sein, seine Definition wiederzuverwenden, anstatt diese alternativen Mittel zu verwenden.
Zum Beispiel
%Vor% Ich könnte die Spalte "alternative Mittel" in meinem Skript sehr gut verwenden, aber ich möchte nicht. In meinem PS1
verwende ich zum Beispiel fettes Blau über terminale Escape-Sequenzen, die ich einfach wiederverwenden könnte, indem ich PS1
auswerte.
Ein großer Vorteil von Open-Source-Software ist, dass die Quelle, na ja, offen ist: -)
Wenn Sie den Code für bash
herunterladen (ich sehe Version 4.2), gibt es eine y.tab.c
-Datei, die die Funktion decode_prompt_string()
enthält:
Sie können versuchen, dies zu extrahieren (zusammen mit allen benötigten Support-Routinen und eine ausführbare Datei zu erstellen, die den Job für Sie erledigt hat. Obwohl diese Support-Routinen von Anfang an viel zu sein scheinen, ist dies eine schwierige Aufgabe .
Abgesehen davon können Sie bash
wahrscheinlich dazu "austricksen", es für Sie zu erweitern, etwa mit:
Jetzt habe ich das für die Lesbarkeit über mehrere Zeilen verteilt, aber es wurde in einer Zeile gemacht.
Damit wird eine interaktive Instanz von bash
ausgeführt, die (hoffentlich) einen ungültigen Befehl übergibt.
Weil es interaktiv ist, druckt es die Eingabeaufforderung, so dass ich die erste Zeile mit der Befehlszeichenkette darauf nehme und diese Befehlszeichenkette entferne. Was übrig bleibt, sollte die Aufforderung sein.
Auf meinem System bekomme ich Folgendes:
%Vor%Dies hat jedoch Probleme mit mehrzeiligen Eingabeaufforderungen und gibt Ihnen tatsächlich eine normale Eingabeaufforderung anstelle der aktuellen Eingabeaufforderung.
Wenn Sie richtig machen wollen , müssen Sie vielleicht ein wenig zu bash
selbst hinzufügen. Hier sind die Schritte zum Hinzufügen eines internen Befehls evalps1
.
Ändere zuerst support/mkversion.sh
, so dass du es nicht mit einem "echten" bash
verwechseln wirst, und dass die FSF alles Wissen für Garantiezwecke ablehnen kann :-) Ändere einfach eine Zeile (ich habe den% hinzugefügt co_de% bit):
Zweitens, ändere 'builtins / Makefile.in, um eine neue Quelldatei hinzuzufügen. Dies beinhaltet eine Reihe von Schritten.
(a) Fügen Sie -pax
zum Ende von $(srcdir)/evalps1.def
hinzu.
(b) Fügen Sie DEFSRC
zum Ende von evalps1.o
hinzu.
(c) Fügen Sie die erforderlichen Abhängigkeiten hinzu:
%Vor% Drittens fügen Sie die OFILES
-Datei selbst hinzu. Dies ist der Code, der ausgeführt wird, wenn Sie den Befehl builtins/evalps1.def
ausführen:
Der Hauptteil davon ist die GPL-Lizenz (da ich sie von evalps1
geändert habe) mit einer sehr einfachen Funktion am Ende, um exit.def
zu erhalten und zu dekodieren.
Schließlich, baue das Ding im obersten Verzeichnis:
%Vor% Der PS1
, der erscheint, kann in bash
umbenannt werden, obwohl ich bezweifle, dass er jemals so weit verbreitet sein wird wie sein Vorgänger: -)
Und wenn Sie es ausführen, können Sie es in Aktion sehen:
%Vor% Nun, wenn Codeänderungen in paxsh
vorgenommen werden, um einen internen Befehl hinzuzufügen, kann das von manchen als Overkill betrachtet werden, aber wenn Sie eine genaue Auswertung von bash
wünschen, ist dies sicherlich eine Option.