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

Ali*_*Ali 15 bash shell ps1

我试图设置,PS1以便它在登录后立即打印出来,但之后会换行.

假设export PS1="\h:\W \u\$ ",第一次(即登录后)你得到:

hostname:~ username$ 
Run Code Online (Sandbox Code Playgroud)

我一直在尝试像我这样的东西~/.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\$ “
Run Code Online (Sandbox Code Playgroud)

期待得到:

# <empty line>
hostname:~ username$ 
Run Code Online (Sandbox Code Playgroud)

从一开始就有一个完整的例子:

hostname:~ username$ ls `# notice: no empty line desired above!`
Desktop      Documents

hostname:~ username$ 
Run Code Online (Sandbox Code Playgroud)

dog*_*ane 15

请尝试以下方法:

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\$ "
Run Code Online (Sandbox Code Playgroud)

说明:

  • PROMPT_COMMAND 是一个特殊的bash变量,每次在设置提示之前执行.
  • 您需要使用该-z标志来检查字符串的长度是否为0.


che*_*ner 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
}'
Run Code Online (Sandbox Code Playgroud)

处理文件时,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
  }'
Run Code Online (Sandbox Code Playgroud)