1 (18.09.2012 13:19:41 отредактировано yars)

Доброго времени!
Возникла такая проблема: если случайно набрать, например, вместо ls -l ды -д, то получим:

 Консоль: user
[user@linuxforum.tech ~]$ ды -д
-bash: $'\320\264\321\213': команда не найдена

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

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

2

yars пишет:

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

Писать внимательнее (даже в названии темы у вас опечатка).
Ну или...  ag

+ открыть спойлер

 Консоль:

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

Был, был и весь вышел...

3

Lupo Alberto пишет:

Писать внимательнее (даже в названии темы у вас опечатка).

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

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

4

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

locale
Был, был и весь вышел...

5

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

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=
Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

6

Кстати, в bash вывод такой же как у вас

 Консоль:

lupo@gentoo-laptop ~ $ дд
bash: $'\320\264\320\264': команда не найдена

в zsh пишет
 Консоль:

lupo@gentoo-laptop ~ % ды -д
zsh: command not found: ды

Был, был и весь вышел...

7

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

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

8

Резюме: настройки локали не при чём, причина в исходниках/патчах 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

9

Кстати: http://unixforum.org/index.php?showtopi … ;p=1225819

10

bormant пишет:

Кстати: http://unixforum.org/index.php?showtopi … ;p=1225819

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

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

11

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

12

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

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

13

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.

14

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

15

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

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

16

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

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580

17

Кстати, в той же теме был помянут и такой патч:
https://abf.rosalinux.ru/import/bash/bl … byte.patch

суть которого в преобразовании перед проверкой мультибайтной строки в юникодную строку символов фиксированной ширины (wchar_t).

18

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

Истинный hotplug - это обычная электрическая розетка: воткнул - работает, и никаких драйверов.
Arch Linux/Xfce/Xiaomi Mi Notebook Pro 15.6 | Slackware64-current/Xfce/Lenovo G580