![为什么我有时会在 xterm/sh 中收到‘sh: $'\302\211 ...': 未找到命令’?](https://linux22.com/image/1385131/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E6%9C%89%E6%97%B6%E4%BC%9A%E5%9C%A8%20xterm%2Fsh%20%E4%B8%AD%E6%94%B6%E5%88%B0%E2%80%98sh%3A%20%24'%5C302%5C211%20...'%3A%20%E6%9C%AA%E6%89%BE%E5%88%B0%E5%91%BD%E4%BB%A4%E2%80%99%EF%BC%9F.png)
有时,当我简单地输入一个有效的命令,如“查找...”或任何命令时,我会得到以下内容,这是完全出乎意料且令人困惑的(...
是我输入的命令名称):
sh: $'\302\211...': command not found
我认为发生了一些损坏。我的提示中没有使用颜色,我正在使用 POSIX 模式下的 Bash shell sh
(chsh
等等/bin/sh
-$SHELL
是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
下面是我的内容。这是我为非登录 shell/etc/shrc
创建的一种在启动时解析某些文件的方法;它是使用以下行中的变量集实现的:sh
ENV
/etc/environment
ENV=/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是
^I
0x9,并且 - 与 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"