Является ли $ PROMPT_COMMAND разделенным двоеточиями списком?

Я хочу, чтобы моя история команд на всех вкладках и windowsх терминала была записана в .bash_history, установив PROMPT_COMMAND в .profile:

  1. export PROMPT_COMMAND="history -a; history -c; history -r;$PROMPT_COMMAND"

Однако когда я проверяю, установлена ​​ли эта переменная среды, я получаю:

 echo $PROMPT_COMMAND printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/\~}" 

Будет ли экспорт PROMPT_COMMAND подобным образом перезаписывать мой существующий список $ PROMPT_COMMAND или необходимо префиксировать значение PROMPT_COMMAND с помощью : перед экспортом?

Является ли $ PROMPT_COMMAND разделенным двоеточиями списком?

Это достаточно легко проверить:

 $ PROMPT_COMMAND='true:true' bash bash: true:true: command not found $ exit 

Итак, ответ «нет».

Но вы можете воспринимать его как последовательность команд, разделенных точкой с запятой , как и любую другую строку шелл-кода:

 $ PROMPT_COMMAND='echo x;echo y' bash x y $ exit 

Вот что имеет назначение в вашем вопросе: несколько команд, разделенных точкой с запятой, с более ранним значением PROMPT_COMMAND прикрепленным к концу.

Конечно, еще один способ запустить несколько команд из PROMPT_COMMAND , это сделать функцию и вызвать ее оттуда.

Тем не менее, последовательность printf в вашем PROMPT_COMMAND выглядит как что-то, что может быть лучше помещено в фактическое приглашение, по двум причинам. Во-первых, он не заканчивается новой строкой, поэтому он может испортить представление Bash о том, где находится курсор, как и другие команды, которые выводят неполные строки перед выходом. Во-вторых, если у вас есть shell, повторно напечатайте приглашение, после завершения табуляции PS1 будет отображаться повторно, но PROMPT_COMMAND не будет работать снова.