为什么我有时会在 xterm/sh 中得到 'sh: $'\302\211 ... ': command not found'?

amn*_*amn 9 bash shell xterm sh

有时,当我简单地输入一个有效的命令,比如“find ...”,或者其他任何东西时,我会得到以下内容,这是完全出乎意料和令人困惑的(...我输入的是命令名称):

sh: $'\302\211...': command not found
Run Code Online (Sandbox Code Playgroud)

我认为有一些腐败正在发生。我不在我的提示中使用颜色,我在 POSIX 模式下使用 Bash shell 作为sh( chshto/bin/sh等等 - $SHELLis sh)。

这是怎么回事,为什么这种情况一直在发生?有什么我可以调试的吗?我认为这xterm不仅仅是一个问题sh,或者至少是两者的结合。

文件,上下文:

我的/etc/profile,与 Arch Linux x86-64 一起分发的:

# /etc/profile

#Set our umask
umask 022

# Set our default path
PATH="/usr/local/sbin:/usr/local/bin:/usr/bin"
export PATH

# Load profiles from /etc/profile.d
if test -d /etc/profile.d/; then
        for profile in /etc/profile.d/*.sh; do
                test -r "$profile" && . "$profile"
        done
        unset profile
fi

# Source global bash config
if test "$PS1" && test "$BASH" && test -r /etc/bash.bashrc; then
        . /etc/bash.bashrc
fi

# Termcap is outdated, old, and crusty, kill it.
unset TERMCAP

# Man is much better than us at figuring this out
unset MANPATH
Run Code Online (Sandbox Code Playgroud)

我的/etc/shrc如下。这是我创建的一种方式sh,用于在启动时解析一些文件,用于非登录 shell;它是使用在行中ENV设置的变量来实现/etc/environmentENV=/etc/shrc

PS1='\u@\H \w \$ '
alias ls='ls -F --color'
alias grep='grep -i --color'
[ -f ~/.shrc ] && . ~/.shrc
Run Code Online (Sandbox Code Playgroud)

我的~/.profile,我在通过第一个虚拟 tty 登录时启动 X:

[[ -z $DISPLAY && $XDG_VTNR -eq 1 ]] && exec xinit -- -dpi 111
Run Code Online (Sandbox Code Playgroud)

我的~/.xinitc,如您所见,我将系统用作 Virtual Box 来宾:

xrdb -merge ~/.Xresources

VBoxClient-all

awesome &

exec xterm
Run Code Online (Sandbox Code Playgroud)

最后,我~/.Xresources猜这里没有花哨的东西:

*faceName: Inconsolata
*faceSize: 10
xterm*VT100*translations: #override <Btn1Up>: select-end(PRIMARY, CLIPBOARD, CUT_BUFFER0)

xterm*colorBDMode: true
xterm*colorBD: #ff8000
xterm*cursorColor: S_red
Run Code Online (Sandbox Code Playgroud)

由于~/.profile除其他外的引用/etc/bash.bashrc,这里是它的内容:

#
# /etc/bash.bashrc
#

# If not running interactively, don't do anything
[[ $- != *i* ]] && return

PS1='[\u@\h \W]\$ '
PS2='> '
PS3='> '
PS4='+ '

case ${TERM} in
  xterm*|rxvt*|Eterm|aterm|kterm|gnome*)
    PROMPT_COMMAND=${PROMPT_COMMAND:+$PROMPT_COMMAND; }'printf "\033]0;%s@%s:%s\007" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
                                                        
    ;;
  screen)
    PROMPT_COMMAND=${PROMPT_COMMAND:+$PROMPT_COMMAND; }'printf "\033_%s@%s:%s\033\\" "${USER}" "${HOSTNAME%%.*}" "${PWD/#$HOME/~}"'
    ;;
esac

[ -r /usr/share/bash-completion/bash_completion   ] && . /usr/share/bash-completion/bash_completion
Run Code Online (Sandbox Code Playgroud)

我不知道那case句话是做什么的,顺便说一句,它看起来确实有点可疑,但话说回来,我该知道谁。

Mar*_*mus 14

当我第一次尝试从剪贴板粘贴命令时会发生这种情况,Linux 风格 ( Ctrl+ Shift+ V) 当这不起作用时,用鼠标粘贴。显然,键盘组合在命令之前插入了一个不可见的字符。解决方法很简单,不要用键盘来粘贴,或者如果有的话,Backspace在用鼠标粘贴之前先按一下。

  • 完美答案!在 Windows 上帮助我使用 git bash (2认同)

jll*_*gre 1

这就是“ CHARACTER TABULATION WITH JUSTIFICATION ”的 UTF-8 编码。

我猜您正在使用特定的键盘或编辑器,该键盘或编辑器使用此不寻常的字符而不是常规选项卡(通常在 shell 命令行中被忽略),或者 shell 和终端仿真器之间的区域设置不匹配。