Gibt es zwischen den folgenden Optionen hinsichtlich Leistung/Effizienz beim Festlegen der Eingabeaufforderung und des Terminaltitels einen großen Unterschied? (abgesehen vom zusätzlichen Aufruf von echo
)
- Stellen Sie PS1 als Ausgabe eines Befehls ein:
PS1="\$(my_fun)"
my_fun() {
echo "my prompt"
}
- Hiermit können Sie
PROMPT_COMMAND
PS1 direkt einstellen:
PROMPT_COMMAND=_prompt_command
_prompt_command() {
PS1="my prompt"
}
Antwort1
Effizienz:
PS1="$(fun)"
ruft die Funktion aufnur einmal(wenn die Zuweisung analysiert wird) und verwendet einen Subshell-Prozess. Dies ist die effizienteste Option, wenn die Ausgabe vollständig statisch ist.PROMPT_COMMAND=fun
ruft die Funktion aufjedes Mal(wann auch immer die Eingabeaufforderung angezeigt wird) und führt es innerhalb des Haupt-Shell-Prozesses aus.PS1="\$(fun)"
ruft die Funktion aufjedes Mal(immer wenn die Eingabeaufforderung angezeigt wird) und erzeugt jedes Mal einen Subshell-Prozess, was es weniger effizient als PROMPT_COMMAND macht (aber manchmal notwendig; siehe nächsten Abschnitt).
Richtigkeit:
- Der Inhalt von
PS1
wird Readline zur Verfügung gestellt, wodurch es die Breite der Eingabeaufforderung erkennt und Ihre Eingabe korrekt umbricht, wenn sie nicht mehr in eine einzelne Zeile passt. Wenn Sie eine Funktion von PS1 aus aufrufen (z. B. ), müssen Sie unsichtbare Sequenzen mit und anstelle des üblichen undPS1="\$(foo)"
umbrechen .\001
\002
\[
\]
- Die Ergebnisse
PROMPT_COMMAND
werden direkt auf dem Bildschirm angezeigt und sind Readline nicht bekannt. Wenn Sie versuchen, diese Methode ausschließlich zu verwenden (das heißt zusammen mit einem leerenPS1=""
), werden Sie feststellen, dass der Cursor keinen Sinn mehr ergibt, sobald die Eingabe länger als eine Zeile ist, und Sie nicht mehr von Zeile 2 zu Zeile 1 zurückgehen können. - Bei mehrzeiligen Shell-Prompts ist es egal, wie die vorherigen Zeilen angezeigt werden, solange diezuletztLinie ist noch durchscheinend
PS1
. - Es spielt auch keine Rolle, was Sie zum Festlegen des Terminaltitels verwenden, da dieser ohnehin nicht in die Eingabeaufforderungsbreite eingerechnet wird.