如何设置在PS1条件换行符?(How to set a conditional newline in

2019-08-16 22:46发布

我想设置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$ 

Answer 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。


Answer 2:

用罗布麻的答案运行,可以使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
  }'


Answer 3:

2018更新 (由chepner的回答启发)

更新 :修正了PROMPT_COMMAND引起其他问题的答案

变化:

  1. 无需导出PS1
  2. 我用“\ n $ PS1”,而不是重新输入。
  3. 其他答案会干扰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 。 尝试了这一点:

  1. 注释掉任何修改PROMPT_COMMAND在你的配置文件(.bash_profile文件等)
  2. 添加INIT_PROMPT_COMMAND="$PROMPT_COMMAND"到您的配置文件

现在打开一个新的shell:

$ echo $INIT_PROMPT_COMMAND
shell_session_history_check; update_terminal_cwd
$ echo $PROMPT_COMMAND
update_terminal_cwd

请注意,当你打开一个新的外壳,它运行既是一个“历史确认”,并更新标签当前工作目录的名称。 请注意,它只能运行在“历史确认”开始,然后再也没有运行它。

注:我只在Mac上的终端测试这一点。 可能是在其他系统上的不同。



文章来源: How to set a conditional newline in PS1?
标签: bash shell ps1