bash:使用花哨的PS1进行换行,进行位置回声

时间:2011-09-30 16:12:59

标签: bash shell ps1

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

任何人都知道如何在$ POS上制作bash wrap(即插入换行符)?甚至在$ 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

1 个答案:

答案 0 :(得分: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\]"

即,将\[ ... \]包裹在所有外线内容中。