bash: Wie PS1, PS2, ... zu bewerten? [Duplikat]

8

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.

    
Harry 08.04.2012, 04:57
quelle

1 Antwort

10

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:

%Vor%

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:

%Vor%

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):

%Vor%

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:

%Vor%

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.

    
paxdiablo 08.04.2012, 05:17
quelle

Tags und Links