bash:使用精美的 PS1 进行换行,进行位置回显

标签 bash shell ps1

我的登录脚本中有类似这样的内容,它将 $foo 保留在终端的右上角。它有效,但有一个警告。如果我输入一个很长的命令,它不会换行。 (好吧,如果它的长度超过两行,它就会换行,但如果有意义的话,第二行会覆盖第一行。)

有人知道如何在 $POS 处进行 bash 换行(即插入换行符)吗?或者甚至在 $COLUMNS?

trunc_pwd () { # See http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x783.html
   local pwdmaxlen=50 # Number of $PWD chars to keep
   local trunc_symbol="<" # Prepend to truncated $PWD
   if (( ${#PWD} > $pwdmaxlen )); then
      local pwdoffset=$(( ${#PWD} - $pwdmaxlen ))
      echo "${trunc_symbol}${PWD:$pwdoffset:$pwdmaxlen}"
   else
      echo ${PWD} | sed "s%^${HOME}%~%g"
   fi
}

foo="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

get_pos ()
{
   POS=$((COLUMNS-(${#foo}+4)))
}

if [[ ${PS1} ]]; then
   PROMPT_COMMAND='get_pos ; echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:$(trunc_pwd)"; echo -ne "\007"'
   export PS1="\u@\h \W \$ \[\e[s\]\[\e[1;\$(echo -n \${POS})H\]$foo\[\e[u\]"
fi

最佳答案

Bash 在提示符中使用 \[\] 转义来确定行长度和换行位置。如果您将任何不应影响行长度的内容(转义序列、$foo 等)包含在其中,则应该没问题。

我不确定为什么你的提示不起作用(而且我不认识一些转义序列,如\e[s,可能是你使用的是 vt100 以外的其他东西),我的尝试有效很好:

PS1='\[\e7\e[0;$((COLUMNS-(${#foo})))H$foo\e8\][\u@\h \W]\$ '

实际上重新看看你的,如果你将 PS1 更改为

PS1="\u@\h \W \$ \[\e[s\e[1;\$(echo -n \${POS})H$foo\e[u\]"

即,将 \[ ...\] 包裹在所有不合规矩的东西上。

关于bash:使用精美的 PS1 进行换行,进行位置回显,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7613166/

相关文章:

database - 在 Linux/POSIX 系统上获取用户全名的最简单方法是什么?

powershell - 在Powershell上相当于Unix的命令

bash - 从 Shell 脚本更改提示?

linux - 如何在 LINUX 的非交互模式下限制 top 命令输出中的行数

bash - shell编程中$(command)和 `command`有什么区别?

android - 使用 Android 应用程序运行脚本

linux - 如何使用 awk getline 清空文件

python - 如何按日期时间范围进行grep?

linux - 限制对脚本运行开关的人的使用

有时使用箭头键时 Bash 提示会发生变化