Доброго времени!
Возникла такая проблема: если случайно набрать, например, вместо ls -l ды -д, то получим:
[console=user]ды -д
-bash: $'\320\264\321\213': команда не найдена
[/console]
Собственно, что именно нужно искать, чтобы победить это, я не знаю. Подскажите пожалуйста!
Опечатки и ненайденные команды
Собственно, что именно нужно искать, чтобы победить это, я не знаю. Подскажите пожалуйста!
Писать внимательнее (даже в названии темы у вас опечатка).
Ну или... :D
Показать
[console]
lupo@gentoo-laptop ~ % alias 'll'='ls -l'
lupo@gentoo-laptop ~ % alias 'дд'='ls -l'
lupo@gentoo-laptop ~ % ll
итого 56
drwxr-xr-x 3 lupo lupo 4096 Авг 15 12:00 bin/
drwxr-xr-x 4 lupo lupo 4096 Авг 24 08:05 dav/
drwxr-xr-x 4 lupo lupo 4096 Сен 16 12:44 Desktop/
drwxr-xr-x 2 lupo lupo 4096 Авг 10 2010 doc/
drwxr-xr-x 11 lupo lupo 4096 Авг 29 20:45 Documentation/
lrwxrwxrwx 1 root root 15 Сен 16 11:41 Downloads -> /home/downloads/
drwxr-xr-x 2 lupo lupo 4096 Сен 15 20:01 dwhelper/
-rw-r--r-- 1 lupo lupo 111 Сен 8 14:48 exclude_backup_list.txt
drwxr-xr-x 5 lupo lupo 4096 Авг 12 15:16 Images/
drwxr-xr-x 2 lupo lupo 4096 Авг 8 11:56 Music/
-rw-r--r-- 1 lupo lupo 421 Апр 19 21:58 my_backup_readme.txt
drwxr-xr-x 2 lupo lupo 4096 Авг 8 11:56 Public/
drwxr-xr-x 3 lupo lupo 4096 Авг 12 15:14 Templates/
drwxr-xr-x 2 lupo lupo 4096 Авг 8 11:56 Video/
-rw-r--r-- 1 lupo lupo 317 Авг 5 2010 XTerm
lupo@gentoo-laptop ~ % дд
итого 56
drwxr-xr-x 3 lupo lupo 4096 Авг 15 12:00 bin/
drwxr-xr-x 4 lupo lupo 4096 Авг 24 08:05 dav/
drwxr-xr-x 4 lupo lupo 4096 Сен 16 12:44 Desktop/
drwxr-xr-x 2 lupo lupo 4096 Авг 10 2010 doc/
drwxr-xr-x 11 lupo lupo 4096 Авг 29 20:45 Documentation/
lrwxrwxrwx 1 root root 15 Сен 16 11:41 Downloads -> /home/downloads/
drwxr-xr-x 2 lupo lupo 4096 Сен 15 20:01 dwhelper/
-rw-r--r-- 1 lupo lupo 111 Сен 8 14:48 exclude_backup_list.txt
drwxr-xr-x 5 lupo lupo 4096 Авг 12 15:16 Images/
drwxr-xr-x 2 lupo lupo 4096 Авг 8 11:56 Music/
-rw-r--r-- 1 lupo lupo 421 Апр 19 21:58 my_backup_readme.txt
drwxr-xr-x 2 lupo lupo 4096 Авг 8 11:56 Public/
drwxr-xr-x 3 lupo lupo 4096 Авг 12 15:14 Templates/
drwxr-xr-x 2 lupo lupo 4096 Авг 8 11:56 Video/
-rw-r--r-- 1 lupo lupo 317 Авг 5 2010 XTerm
[/console]
Писать внимательнее (даже в названии темы у вас опечатка).
Это... случайность. Ну, а с алиасами - нтересное, но все же половинчатое решение. Я бы хотел узнать, что именно за это может отвечать... Шрифты и локаль в порядке.
yars, честно говоря, так и не понял, в чём именно вопрос :(
Вам не нравится такой «кодированный» вывод ошибки в консоль?
Покажите
locale
Да, это вылезло в процессе обновления системы. Вот и хочу вернуть это в нормальное состояние. Вот вывод:
locale
LANG=ru_RU.UTF-8
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE=C
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=
Кстати, в bash вывод такой же как у вас
[console]
lupo@gentoo-laptop ~ $ дд
bash: $'\320\264\320\264': команда не найдена
[/console]
в zsh пишет
[console]
lupo@gentoo-laptop ~ % ды -д
zsh: command not found: ды
[/console]
Выходит, это проблема bash'а? Попробую пересобрать. О результатах отпишусь.
Резюме: настройки локали не при чём, причина в исходниках/патчах bash-а.
Показать
Slackware-14.0_RC4
# wget -r -nH --cut-dirs=5 ftp://ftp.osuosl.org/pub/slackware/slackware-13.37/source/a/bash
# cd bash
# chmod +x *Build
# ./*Build
# explodepkg /tmp/bash-*t?z
# bin/bash4.new
# дд
bash4.new: дд: command not found
# exit
# дд
-bash: $'\320\264\320\264': command not found
Кстати: http://unixforum.org/index.php?showtopi … ;p=1225819
О! Спасибо, я эту темку смотрел, но не до конца. Интерес к ней немного поугас. Значит, нужно найти патч(и), что в эту функцию вмешиваются, откатить и отправить багрепорт Патрику :)
Как временная мера прописывание этой функции в /etc/.bashrc вполне, но... это полумера :)
Да, кстати, а вы пересобирали (см. сообщение №8) вообще без патчей? То-то я гляжу, у меня та же последовательность действий, что под спойлером, результата не дала.
yars,
под спойлером была демонстрация того, что собранный в 14.0_RC4 bash, взятый из 13.37, указанной проблемой не страдает. Следовательно, нужно смотреть, что там в этой части менялось между версиями bash-а.
Но мог и элементарно чего-то не заметить.
Ай, я черт слепой, прошу прощения. :) Я действительно не заметил, что это bash из 13.37. Сейчас пороюсь в исходниках.
yars,
всё на поверхности (см. добавленные вызовы ansic_shouldquote(), ansic_quote()):
--- bash-4.1/execute_cmd.c Wed Dec 30 21:55:37 2009
+++ bash-4.2/execute_cmd.c Thu Feb 10 02:32:25 2011
...
@@ -4571,6 +4731,9 @@
hookf = find_function (NOTFOUND_HOOK);
if (hookf == 0)
{
+ /* Make sure filenames are displayed using printable characters */
+ if (ansic_shouldquote (pathname))
+ pathname = ansic_quote (pathname, 0, NULL);
internal_error (_("%s: command not found"), pathname);
exit (EX_NOTFOUND); /* Posix.2 says the exit status is 127 */
}
Показать
lib/sh/strtrans.c
/* return 1 if we need to quote with $'...' because of non-printing chars. */
int
ansic_shouldquote (string)
const char *string;
{
const char *s;
unsigned char c;
if (string == 0)
return 0;
for (s = string; c = *s; s++)
if (ISPRINT (c) == 0)
return 1;
return 0;
}
lib/sh/strtrans.c
/* Take a string STR, possibly containing non-printing characters, and turn it
into a $'...' ANSI-C style quoted string. Returns a new string. */
char *
ansic_quote (str, flags, rlen)
char *str;
int flags, *rlen;
{
char *r, *ret, *s;
int l, rsize;
unsigned char c;
if (str == 0 || *str == 0)
return ((char *)0);
l = strlen (str);
rsize = 4 * l + 4;
r = ret = (char *)xmalloc (rsize);
*r++ = '$';
*r++ = '\'';
for (s = str, l = 0; *s; s++)
{
c = *s;
l = 1; /* 1 == add backslash; 0 == no backslash */
switch (c)
{
case ESC: c = 'E'; break;
#ifdef __STDC__
case '\a': c = 'a'; break;
case '\v': c = 'v'; break;
#else
case '\007': c = 'a'; break;
case 0x0b: c = 'v'; break;
#endif
case '\b': c = 'b'; break;
case '\f': c = 'f'; break;
case '\n': c = 'n'; break;
case '\r': c = 'r'; break;
case '\t': c = 't'; break;
case '\\':
case '\'':
break;
default:
if (ISPRINT (c) == 0)
{
*r++ = '\\';
*r++ = TOCHAR ((c >> 6) & 07);
*r++ = TOCHAR ((c >> 3) & 07);
*r++ = TOCHAR (c & 07);
continue;
}
l = 0;
break;
}
if (l)
*r++ = '\\';
*r++ = c;
}
*r++ = '\'';
*r = '\0';
if (rlen)
*rlen = r - ret;
return ret;
}
Вот только "ansic_shouldquote()" использует "по-char-ную" (const char *s; ... s++) проверку на "печатность", что весьма слабо подходит для UTF-8.
Ну и лечить соответственно: откатить вышеприведённый фрагмент патча, либо модифицировать приведённую пару функций на детектирование UTF-8 и соответствующее поведение.
Хм, на модификацию меня пока не хватит (только-только c мэйкфайлами научился обращаться), а вот патчик откачу, спасибо.
А по какому признаку можно определить, что имеем дело с UTF-8?
Ладно, напишу багрепорт, раз сам эту багофичу не могу побороть "правильно". Патч я откатил, все нормально, вроде бы ничего не отвалилось пока что :) А вот с детектом UTF-8 надо подумать...
Кстати, в той же теме был помянут и такой патч:
https://abf.rosalinux.ru/import/bash/blob/rosa2012lts/bash-4.2-multibyte.patch
суть которого в преобразовании перед проверкой мультибайтной строки в юникодную строку символов фиксированной ширины (wchar_t).
Спасибо, вот, сижу, разбираюсь пока что... Сказывается нехватка опыта :)