¿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
)
- Configure PS1 para que sea la salida de un comando:
PS1="\$(my_fun)"
my_fun() {
echo "my prompt"
}
- Úselo
PROMPT_COMMAND
para 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=fun
llamará 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
PS1
se 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 ejemploPS1="\$(foo)"
), necesita envolver secuencias invisibles con\001
y\002
en lugar del habitual\[
y\]
. - Los resultados
PROMPT_COMMAND
se muestran directamente en la pantalla y Readline no los conoce. Si intenta utilizar este método exclusivamente (es decir, junto con un vacíoPS1=""
), 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.