2

我的登录脚本中有类似的东西,它将 $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
4

1 回答 1

3

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

即,环绕\[ ... \]所有的外线的东西。

于 2011-09-30T17:33:58.617 回答