我想设置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。
用罗布麻的答案运行,可以使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
引起其他问题的答案
变化:
- 无需导出PS1
- 我用“\ n $ PS1”,而不是重新输入。
- 其他答案会干扰
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
在你的配置文件(.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
请注意,当你打开一个新的外壳,它运行既是一个“历史确认”,并更新标签当前工作目录的名称。 请注意,它只能运行在“历史确认”开始,然后再也没有运行它。
注:我只在Mac上的终端测试这一点。 可能是在其他系统上的不同。