Bash: PS1 vs Prompt Команда для установки приглашения и заголовка

Bash: PS1 vs Prompt Команда для установки приглашения и заголовка

Есть ли большая разница между следующими вариантами с точки зрения производительности/эффективности для настройки приглашения и заголовка терминала? (кроме дополнительного вызова echo)

  1. Установите PS1 в качестве вывода команды:
PS1="\$(my_fun)"
my_fun() {
  echo "my prompt"
}
  1. Используйте 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.
  • Также не имеет значения, какой способ установки заголовка терминала используется, поскольку он в любом случае не учитывается в ширине приглашения.

Связанный контент