[英]How to set a conditional newline in 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$
请尝试以下方法:
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。 使用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
}'
2018年更新 (灵感来自chepner的回答)
更新 :修复了由其他答案引起的PROMPT_COMMAND
问题
变化:
PROMPT_COMMAND
的默认行为(更多信息如下) 在〜/ .bash_profile中输入以下内容(用您的提示替换第一行):
PS1=YOUR_PROMPT_HERE
add_newline_to_prompt() {
is_new_login="true"
INIT_PROMPT_COMMAND="$PROMPT_COMMAND"
DEFAULT_PROMPT_COMMAND=update_terminal_cwd
PROMPT_COMMAND='{
if [ $is_new_login = "true" ]; then
is_new_login="false"
eval $INIT_PROMPT_COMMAND
else
PS1="\n$PS1"
PROMPT_COMMAND=$DEFAULT_PROMPT_COMMAND
fi
}'
}
add_newline_to_prompt
PROMPT_COMMAND
我注意到终端中的选项卡名称没有更新到我当前的工作目录并进行了一些调查。 我意识到上面的解决方案正在弄乱PROMPT_COMMAND
。 试试这个:
PROMPT_COMMAND
对PROMPT_COMMAND
任何修改(.bash_profile等) INIT_PROMPT_COMMAND="$PROMPT_COMMAND"
添加到您的配置文件中 现在打开一个新shell:
$ echo $INIT_PROMPT_COMMAND
shell_session_history_check; update_terminal_cwd
$ echo $PROMPT_COMMAND
update_terminal_cwd
请注意,当您打开一个新shell时,它会同时运行“历史记录检查”并更新选项卡当前工作目录的名称。 请注意,它最初只运行“历史记录检查”,然后再从不运行它。
注意:我只在Mac的终端上进行了测试。 在其他系统上可能会有所不同。
将其插入到您的 .bashrc 中:
PROMPT_COMMAND="export PROMPT_COMMAND=echo"
alias clear="clear; export PROMPT_COMMAND='export PROMPT_COMMAND='echo''"
这正是您想要的。 在 PS1 或任何函数中不需要 \\n。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.