如何在PS1中设置条件换行符?

时间:2013-02-13 17:17:16

标签: bash shell 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$ 

3 个答案:

答案 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问题

的变化:

  1. No need to export PS1
  2. 我使用“\ n $ PS1”而不是重新输入。
  3. 其他答案会影响PROMPT_COMMAND的默认行为(下面有更多信息)
  4. 在〜/ .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"添加到您的配置文件
    3. 现在打开一个新shell:

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

      请注意,当您打开一个新shell时,它会运行“历史记录检查”并更新选项卡当前工作目录的名称。请注意,它最初只运行“历史检查”,然后再也不会再运行它。

      注意:我只在Mac的终端上进行了测试。在其他系统上可能会有所不同。