15

我正在尝试进行设置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$ 
4

4 回答 4

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\$ "

解释:

  • PROMPT_COMMAND是一个特殊的 bash 变量,每次设置提示之前都会执行。
  • 您需要使用-z标志来检查字符串的长度是否为 0。
于 2013-02-13T17:40:24.093 回答
5

使用 dogbane 的答案运行,您可以使 PROMPT_COMMAND “自毁”,从而无需在每个命令后运行函数。

在您的.bashrcor.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在重置提示以包含换行之前清除自身和计数器。随后,noPROMPT_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
  }'
于 2013-02-13T18:39:24.243 回答
1

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"到您的配置文件

现在打开一个新的外壳:

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

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

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

于 2018-02-21T20:38:56.330 回答
0

将其插入您的 .bashrc:

PROMPT_COMMAND="export PROMPT_COMMAND=echo"
alias clear="clear; export PROMPT_COMMAND='export PROMPT_COMMAND='echo''"

这正是您想要的。PS1 中不需要 \n 或任何功能。

于 2021-11-09T16:39:50.770 回答