为什么我有时会在 xterm/sh 中收到‘sh: $'\302\211 ...': 未找到命令’?

为什么我有时会在 xterm/sh 中收到‘sh: $'\302\211 ...': 未找到命令’?

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

sh: $'\302\211...': command not found

我认为发生了一些损坏。我的提示中没有使用颜色,我正在使用 POSIX 模式下的 Bash shell shchsh等等/bin/sh-$SHELLsh)。

发生了什么事?为什么这种情况一直发生?我可以调试什么吗?我认为这比 更成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

下面是我的内容。这是我为非登录 shell/etc/shrc创建的一种在启动时解析某些文件的方法;它是使用以下行中的变量集实现的:shENV/etc/environmentENV=/etc/shrc

PS1='\u@\H \w \$ '
alias ls='ls -F --color'
alias grep='grep -i --color'
[ -f ~/.shrc ] && . ~/.shrc

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

[[ -z $DISPLAY && $XDG_VTNR -eq 1 ]] && exec xinit -- -dpi 111

我的~/.xinitc,如您所见,我正在将系统用作 Virtual Box 客户机:

xrdb -merge ~/.Xresources

VBoxClient-all

awesome &

exec xterm

最后,~/.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

由于~/.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

顺便说一句,我不知道该case语句的作用是什么,它确实看起来有点可疑,但话又说回来,我又有什么资格知道呢。

答案1

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

答案2

提供0x89了一个线索:使用默认eightBitInput资源设置,对xterm输入的 8 位代码进行逻辑或运算,将其从 0-127 映射到 128-255:

  • tab^I0x9,并且
  • 与 0x80 进行“或”运算得出奇数 0x89。

您可以通过在按下 时不同时按下“meta”键来解决该问题tab

eightBitInput功能很旧(可追溯到 1989 年的 X11R4),对应于关键功能。后来,它被修改为可以使用 UTF-8补丁 #183 - 2003/12/26 - XFree86 4.3.99.903

  • 修改处理eightBitInput资源以 UTF-8 模式将值转换为 UTF-8。否则,将向应用程序发送非法的 UTF-8 代码(由 Bram Moolenaar 报告)。

人们倾向于bash认为元模式是指在事物前面加上转义字符,但其实不然。参见Alt 键在 Bash 中不起作用在 ncurses 常见问题解答中。

如果你转身eightBitInput 离开,这并不能解决这个特定问题:当您按下时xterm会发送,这应该反对......escapetabmetatabbash

答案3

在我的工作机器上,我有一台 Windows 系统,并使用 git-bash CLI(mintty cygwin)来运行我通常在 Linux 上运行的命令

bash: $'\302\226curl': command not found我刚从 power shell 窗口复制粘贴后得到了以下信息:

$ curl -v -F foobar
bash: $'\302\226curl': command not found

肉眼完全看不见,看起来就像$ curl -v -F foobar

因此我确实删除了命令之前的所有空格,例如:

$curl -v -F foobar

注意,中间没有空格$

希望这对某人有帮助,加油

答案4

这解决了问题:

setxkbmap -option "nbsp:none"

相关内容