printf 命令莫名其妙地输出提示文本

printf 命令莫名其妙地输出提示文本

当我在命令行上执行时printf,由于某种原因,它会在输出中包含我的提示文本。命令:

printf '%s\n' 'Some text'

输出:

' 'Some text' {~} (myusername@my-PC-name)Some text

奇怪的是,只有当我在格式字符串中使用换行符转义序列时,它才会这样做。如果我省略它:

printf '%s' 'Some text'

我得到:

Some text

我的提示设置肯定有问题。下面是我的 .bashrc 文件中的片段。大部分代码都随文件一起提供。我删除了文件附带的注释,并添加了注释以表明我的修改:

if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)
fi

case "$TERM" in
    xterm-color|*-256color) color_prompt=yes;;
esac

force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
      color_prompt=yes
    else
      color_prompt=
    fi
fi

# I added these lines:    
black="\[\033[0;30m\]"
blue="\[\033[0;34m\]"
green="\[\033[0;32m\]"
cyan="\[\033[1;36m\]"
red="\[\033[0;31m\]"
magenta="\[\033[0;35m\]"
yellow="\[\033[1;33m\]"
gray="\[\033[0;37m\]"
reset_color="\[\033[00m\]"
# end of my additions

if [ "$color_prompt" = yes ]; then
    # I added the following two lines:
    user_host_color="$cyan"
    path_color="$yellow"
    # Below is the original line assigning PS1:
    # PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
    # Below is my version:
    PS1="${debian_chroot:+($debian_chroot)}${user_host_color}\u@\h${reset_color}:${path_color}\w${reset_color}\\$ "
    # My addition below: unsetting some variables I added
    unset user_host_color path_color
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

# My addition below: unsetting variables I added
unset black blue green cyan red magenta yellow gray reset_color

case "$TERM" in
xterm*|rxvt*)
    PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
    ;;
*)
    ;;
esac

这会产生如下颜色提示:myusername@my-PC-name:/current/path $,其中myusername为绿色,my-PC-name为蓝色,/current/path为黄色,$为绿色。

关于我的系统的说明:我在 Windows 10(秋季创意者更新)机器上通过 Windows Subsystem for Linux 在 Ubuntu 16.04.3 LTS 上运行 Bash 4.3.48。因此,这不是完整的 Ubuntu 桌面系统,它只是 Windows Store 上提供的命令行版本。虽然我不确定这对这个问题是否重要。

相关内容