LinuxForum.Fans
Тема

Опечатки и ненайденные команды

Автор: yars 18 сообщений 5924 просмотров
#275419

Доброго времени!
Возникла такая проблема: если случайно набрать, например, вместо ls -l ды -д, то получим:
[console=user]ды -д
-bash: $'\320\264\321\213': команда не найдена
[/console]
Собственно, что именно нужно искать, чтобы победить это, я не знаю. Подскажите пожалуйста!

#275420
"yars" написал:
Собственно, что именно нужно искать, чтобы победить это, я не знаю. Подскажите пожалуйста!

Писать внимательнее (даже в названии темы у вас опечатка).
Ну или... :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]
#275421
"Lupo Alberto" написал:
Писать внимательнее (даже в названии темы у вас опечатка).

Это... случайность. Ну, а с алиасами - нтересное, но все же половинчатое решение. Я бы хотел узнать, что именно за это может отвечать... Шрифты и локаль в порядке.

#275422

yars, честно говоря, так и не понял, в чём именно вопрос :(
Вам не нравится такой «кодированный» вывод ошибки в консоль?
Покажите

text

locale
#275423

Да, это вылезло в процессе обновления системы. Вот и хочу вернуть это в нормальное состояние. Вот вывод:

text
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=
#275424

Кстати, в bash вывод такой же как у вас
[console]
lupo@gentoo-laptop ~ $ дд
bash: $'\320\264\320\264': команда не найдена
[/console]
в zsh пишет
[console]
lupo@gentoo-laptop ~ % ды -д
zsh: command not found: ды
[/console]

#275427

Выходит, это проблема bash'а? Попробую пересобрать. О результатах отпишусь.

#275431

Резюме: настройки локали не при чём, причина в исходниках/патчах bash-а.

Показать
Собственно проверка:
Slackware-14.0_RC4
text

# 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

#275700
"bormant" написал:
Кстати: http://unixforum.org/index.php?showtopi … ;p=1225819

О! Спасибо, я эту темку смотрел, но не до конца. Интерес к ней немного поугас. Значит, нужно найти патч(и), что в эту функцию вмешиваются, откатить и отправить багрепорт Патрику :)
Как временная мера прописывание этой функции в /etc/.bashrc вполне, но... это полумера :)
Да, кстати, а вы пересобирали (см. сообщение №8) вообще без патчей? То-то я гляжу, у меня та же последовательность действий, что под спойлером, результата не дала.

#275701

yars,
под спойлером была демонстрация того, что собранный в 14.0_RC4 bash, взятый из 13.37, указанной проблемой не страдает. Следовательно, нужно смотреть, что там в этой части менялось между версиями bash-а.
Но мог и элементарно чего-то не заметить.

#275702

Ай, я черт слепой, прошу прощения. :) Я действительно не заметил, что это bash из 13.37. Сейчас пороюсь в исходниках.

#275703

yars,
всё на поверхности (см. добавленные вызовы ansic_shouldquote(), ansic_quote()):

text

--- 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
text

/* 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

text

/* 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.

#275705

Ну и лечить соответственно: откатить вышеприведённый фрагмент патча, либо модифицировать приведённую пару функций на детектирование UTF-8 и соответствующее поведение.

#275711

Хм, на модификацию меня пока не хватит (только-только c мэйкфайлами научился обращаться), а вот патчик откачу, спасибо.
А по какому признаку можно определить, что имеем дело с UTF-8?

#275725

Ладно, напишу багрепорт, раз сам эту багофичу не могу побороть "правильно". Патч я откатил, все нормально, вроде бы ничего не отвалилось пока что :) А вот с детектом UTF-8 надо подумать...

#275976

Спасибо, вот, сижу, разбираюсь пока что... Сказывается нехватка опыта :)

Войдите или зарегистрируйтесь, чтобы ответить.