繁体   English   中英

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

[英]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问题

变化:

  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_COMMANDPROMPT_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

请注意,当您打开一个新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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM