Bash: PS1 vs Prompt Command para configurar el mensaje y el título

Bash: PS1 vs Prompt Command para configurar el mensaje y el título

¿Hay mucha diferencia entre las siguientes opciones con respecto al rendimiento/eficiencia para configurar el mensaje y el título del terminal? (aparte de la llamada adicional a echo)

  1. Configure PS1 para que sea la salida de un comando:
PS1="\$(my_fun)"
my_fun() {
  echo "my prompt"
}
  1. Úselo PROMPT_COMMANDpara configurar PS1 directamente:
PROMPT_COMMAND=_prompt_command
_prompt_command() {
    PS1="my prompt"
}

Respuesta1

Eficiencia:

  • PS1="$(fun)"llamará a la funciónsólo una vez(cuando se analiza la tarea) y utilizará un proceso de subcapa. Es la opción más eficiente si la salida es completamente estática.
  • PROMPT_COMMAND=funllamará a la funcióncada vez(siempre que se muestre el mensaje) y lo ejecutará dentro del proceso principal del shell.
  • PS1="\$(fun)"llamará a la funcióncada vez(cada vez que se muestra el mensaje) y generará un proceso de subcapa cada vez, lo que lo hace menos eficiente que PROMPT_COMMAND (pero a veces es necesario; consulte la siguiente sección).

Exactitud:

  • El contenido de PS1se proporciona a Readline, lo que le permite conocer el ancho del mensaje y ajustar correctamente su entrada si ya no cabe en una sola línea. Al llamar a una función desde PS1 (por ejemplo PS1="\$(foo)"), necesita envolver secuencias invisibles con \001y \002en lugar del habitual \[y \].
  • Los resultados PROMPT_COMMANDse muestran directamente en la pantalla y Readline no los conoce. Si intenta utilizar este método exclusivamente (es decir, junto con un vacío PS1=""), notará que tan pronto como la entrada sea más larga que una sola línea, el cursor ya no tendrá sentido y ya no podrá retroceder desde la línea 2. a la línea 1.
  • Para mensajes de shell de varias líneas, no importa cómo se muestren las líneas anteriores, siempre que elúltimoLa línea todavía se muestra a través de PS1.
  • Tampoco importa lo que use para configurar el título del terminal, ya que de todos modos no se cuenta en el ancho del mensaje.

información relacionada