4

Иногда, когда я просто набираю допустимую команду типа «найти ...» или что-то действительно, я получаю следующее, что совершенно неожиданно и сбивает с толку (... это имя команды, которое я печатаю):

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

Я думаю, что происходит коррупция. Я не использую цвет в своем приглашении, я использую оболочку Bash в режиме POSIX как sh (chsh to /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

Мой /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 , я запускаю X при входе через первый виртуальный tty:

[[ -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 , кстати, оно выглядит немного подозрительно, но опять же, кто я такой, чтобы знать.

6 ответов6

2

0x89 дает подсказку: с настройкой ресурса по умолчанию в eightBitInput , xterm логически- ИЛИ вводит 8-битные коды, чтобы отобразить их от 0-127 до 128-255:

  • вкладка ^I 0x9, и
  • ORed с 0x80 дает нечетное 0x89.

Вы можете решить эту проблему, не нажимая клавишу "meta" одновременно с нажатием клавиши Tab.

Функция eightBitInput (датируется X11R4 в 1989 году) и соответствует функции мета- ключа. Намного позже, он был изменен для работы с UTF-8 в патче № 183 - 2003/12/26 - XFree86 4.3.99.903:

  • изменить обработку ресурса eightBitInput в режиме UTF-8 для перевода значения в UTF-8. В противном случае в приложение отправляется нелегальный код UTF-8 (отчет Брэма Муленаара).

Люди, использующие bash склонны полагать, что мета-режим относится к префиксам вещей с escape-символом, но имеют его в обратном порядке. См. Alt-ключи не работают в bash в FAQ по ncurses.

Если включить eightBitInput выключить, что бы не решить эту конкретную проблему: xterm бы отправить вкладку бежать, когда вы нажимаете вкладку мета, который bash должен возражать ...

2

Это происходит, когда я впервые пытаюсь вставить команду из буфера обмена в стиле Linux (Ctrl+Shift+V), а когда это не работает, вставьте с помощью мыши. Очевидно комбинация клавиатуры вставляет невидимый символ перед командой. Решение простое: не используйте клавиатуру для вставки или, если она есть, нажмите клавишу Backspace перед вставкой с помощью мыши.

1

Это кодировка UTF-8 « ТАБЛИЦА ХАРАКТЕРОВ С ОБОСНОВАНИЕМ ».

Я предполагаю, что вы используете специальную клавиатуру или редактор, который использует этот необычный символ вместо обычной вкладки, которая обычно игнорируется в командной строке оболочки, или имеет несоответствие локали между оболочкой и эмулятором терминала.

1

на моей рабочей машине у меня есть окна и я использую CLI git-bash (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

обратите внимание, что между $ нет больше пробелов

надеюсь, что это помогает кому-то, ура

1

Это решит проблему:

setxkbmap -option "nbsp:none"
0

Оболочка интерпретирует невидимых символов и жалуется на них, подобно тому, как jlliagre говорил в своем ответе упоминание ТАБЛИЦЫ ХАРАКТЕРОВ С ОБОСНОВАНИЕМ.

Если вы не ввели никаких невидимых символов, то оболочка получает некоторые данные в другом месте и неправильно истолковывает их как ввод. Другими словами, это ошибка. Вы должны сообщить об этом сопровождающим эмулятора терминала, который вы используете.

(Я понимаю, что этому вопросу уже четыре года, но это может помочь кому-то еще.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .