我正在尝试设置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$
答案 0 :(得分:14)
尝试以下方法:
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。答案 1 :(得分:5)
使用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
}'
答案 2 :(得分:1)
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
的任何修改(.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的终端上进行了测试。在其他系统上可能会有所不同。