Как установить условную новую строку в PS1?

Я пытаюсь установить PS1 так, чтобы он распечатывал что-то сразу после входа в систему, но позже ему была добавлена ​​новая строка.

Предположим export PS1="\h:\W \u\$ ", поэтому в первый раз (т.е. сразу после входа в систему) вы получите:

hostname:~ username$ 

Я пытаюсь что-то вроде моего ~/.bashrc:

function __ps1_newline_login {
  if [[ -n "${PS1_NEWLINE_LOGIN-}" ]]; then
    PS1_NEWLINE_LOGIN=true
  else
    printf '\n'
  fi
}

export PS1="\$(__ps1_newline_login)\h:\W \u\$ "

ожидая получить:

# <empty line>
hostname:~ username$ 

Полный пример из начала:

hostname:~ username$ ls `# notice: no empty line desired above!`
Desktop      Documents

hostname:~ username$ 

Ответ 1

Попробуйте следующее:

function __ps1_newline_login {
  if [[ -z "${PS1_NEWLINE_LOGIN}" ]]; then
    PS1_NEWLINE_LOGIN=true
  else
    printf '\n'
  fi
}

PROMPT_COMMAND='__ps1_newline_login'
export PS1="\h:\W \u\$ "

Пояснение:

  • PROMPT_COMMAND - специальная переменная bash, которая выполняется каждый раз перед установкой подсказки.
  • Вам нужно использовать флаг -z, чтобы проверить, равна ли длина строки 0.

Ответ 2

Запуск с ответчиком dogbane, вы можете сделать PROMPT_COMMAND "самоуничтожением", предотвращая необходимость запуска функции после каждой команды.

В вашем файле .bashrc или .bash_profile сделайте

export PS1='\h:\W \u\$ '
reset_prompt () {
  PS1='\n\h:\W \u\$ '
}
PROMPT_COMMAND='(( PROMPT_CTR-- < 0 )) && { 
  unset PROMPT_COMMAND PROMPT_CTR
  reset_prompt
}'

Когда файл обрабатывается, PS1 изначально не отображает новую строку перед запросом. Тем не менее, PROMPT_CTR немедленно уменьшается до -1 (оно неявно 0 перед), прежде чем приглашение будет показано в первый раз. После первой команды PROMPT_COMMAND очищает себя и счетчик перед сбросом запроса, чтобы включить новую строку. Впоследствии не будет выполняться PROMPT_COMMAND.

Конечно, есть счастливая среда, где вместо очистки PROMPT_COMMAND она просто сбрасывается на более обычную функцию. Что-то вроде

export PS1='\h:\W \u\$ '
normal_prompt_cmd () {
   ...
}
reset_prompt () {
  PS1='\n\h:\W \u\$ '
}
PROMPT_COMMAND='(( PROMPT_CTR-- < 0 )) && {
   PROMPT_COMMAND=normal_prompt_cmd
   reset_prompt
   unset PROMPT_CTR
  }'

Ответ 3

Обновление 2018 (вдохновлено ответом chepner)

Изменения:


Введите следующее в ~/.bash_profile (подставляя первую строку с приглашением):

PS1=YOUR PROMPT HERE (without newline)

reset_prompt () {
  PS1="\n$PS1"
}
PROMPT_COMMAND='(( PROMPT_CTR-- < 0 )) && {
  unset PROMPT_COMMAND PROMPT_CTR
  reset_prompt
}'