Bash: PS1 vs. Prompt-Befehl zum Festlegen von Eingabeaufforderung und Titel

Bash: PS1 vs. Prompt-Befehl zum Festlegen von Eingabeaufforderung und Titel

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)

  1. Stellen Sie PS1 als Ausgabe eines Befehls ein:
PS1="\$(my_fun)"
my_fun() {
  echo "my prompt"
}
  1. Hiermit können Sie PROMPT_COMMANDPS1 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=funruft 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 PS1wird 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 und PS1="\$(foo)"umbrechen .\001\002\[\]
  • Die Ergebnisse PROMPT_COMMANDwerden 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 leeren PS1=""), 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.

verwandte Informationen