Как установить условную новую строку в 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
}'