Есть ли большая разница между следующими вариантами с точки зрения производительности/эффективности для настройки приглашения и заголовка терминала? (кроме дополнительного вызова echo
)
- Установите PS1 в качестве вывода команды:
PS1="\$(my_fun)"
my_fun() {
echo "my prompt"
}
- Используйте
PROMPT_COMMAND
для настройки PS1 напрямую:
PROMPT_COMMAND=_prompt_command
_prompt_command() {
PS1="my prompt"
}
решение1
Эффективность:
PS1="$(fun)"
вызовет функциютолько раз(когда назначение разбирается) и будет использовать процесс подоболочки. Это наиболее эффективный вариант, если вывод полностью статичен.PROMPT_COMMAND=fun
вызовет функциюкаждый раз(всякий раз, когда отображается приглашение) и запустит его в основном процессе оболочки.PS1="\$(fun)"
вызовет функциюкаждый раз(всякий раз, когда отображается приглашение) и каждый раз будет порождать процесс подоболочки, что делает его менее эффективным, чем PROMPT_COMMAND (но иногда необходимым; см. следующий раздел.)
Корректность:
- Содержимое
PS1
предоставляется Readline, что позволяет ему узнать ширину приглашения и правильно переносить ваш ввод, если он больше не помещается в одну строку. При вызове функции из PS1 (например,PS1="\$(foo)"
) вам необходимо переносить невидимые последовательности с помощью\001
и\002
вместо обычных\[
и\]
. - Результаты
PROMPT_COMMAND
отображаются непосредственно на экране и не известны Readline. Если вы попытаетесь использовать этот метод исключительно (то есть вместе с пустымPS1=""
), вы заметите, что как только ввод станет длиннее одной строки, курсор перестанет иметь смысл, и вы больше не сможете вернуться со строки 2 на строку 1. - Для многострочных приглашений оболочки не имеет значения, как отображаются предыдущие строки, главное, чтобыпоследнийлиния все еще отображается через
PS1
. - Также не имеет значения, какой способ установки заголовка терминала используется, поскольку он в любом случае не учитывается в ширине приглашения.