После трубы команда считается префиксом пробела

Иногда на моем терминале (Ubuntu) при вводе:

ls | grep toto

Я получаю эту ошибку:

 grep: command not found*

Обратите внимание, что оболочка пишет grep с префиксом пробела. Как это может быть возможным?

Ответ 1

< Проверяет source вашего исходного вопроса >

<pre style="width:650px; white-space:pre-wrap">Sometimes on my terminal (Ubuntu) when I type :

ls |&#160;grep toto

Спасибо за копирование актуальной строки! (Но вы не скопировали-вставьте сообщение об ошибке, озорной!) Увидите проблему? После символа трубы у вас есть неразрывное пространство. Оболочки понимают только символы ASCII; все символы, отличные от ASCII, включая U + 00A0 NO-BREAK SPACE, рассматриваются как составляющие слова, так что нерушимое пространство рассматривается как часть слова, которое находится в позиции имени команды.

Предположительно вы используете раскладку клавиатуры, где вам нужно удерживать AltGr для ввода |. Обязательно отпустите модификатор AltGr, чтобы случайно не набрать AltGr + Space вместо Space. Обратите внимание, что вам не нужно места там, вы можете набрать ls |grep toto, если это проще на пальцах.

Ответ 2

Чтобы ответить на вопрос Gilles, вы можете отключить это поведение в Ubuntu/Gnome, заменив нерушимый пробельный символ обычным пространством в настройках раскладки клавиатуры.

Настройки → Клавиатура → Макет → Параметры и выберите "Использование клавиши пробела для ввода символа пробела без пробелов" и установите для него "Обычное пространство на любом уровне".

Или из командной строки

setxkbmap -option "nbsp:none"

Я нашел это исправление в http://my.opera.com/nicomen/blog/unrecognized-character-xc2.

Это также раздражало французскую клавиатуру для скриптов Perl при использовании фигурных скобок или в Python при использовании символа hash для комментариев, за которым следует пробел.