Интерактивное копирование файлов: «cp: перезаписать»

Вы можете попробовать разместить запись для эквивалентного DNS в вашем /etc/hosts, например:

91.189.88.152       archive.ubuntu.com
3
09.11.2019, 20:31
2 ответа

Если вы посмотрите на исходный код и выполните поиск interactive, вы увидите, что он устанавливает x.interactive = I_ASK_USER;, так что вы можете искать в этом и других файлах, где отмечен I_ASK_USER.

В copy.cвы найдете этот символ рядом с вызовом функции overwrite_ok, и эта функция содержит вызов функции yesno.

Остальное оставлено читателю в качестве упражнения. ;-)

2
27.01.2020, 21:10

Стандарт POSIX указывает, что ответ должен быть «утвердительным» для выполнения копирования, когда действует -i.

Для GNU cp, фактический ввод в этот момент обрабатывается функцией с именем yesno(). Эта функция определена в файлеlib/yesno.cисходного дистрибутива gnulib и выглядит так:

bool
yesno (void)
{
  bool yes;

#if ENABLE_NLS
  char *response = NULL;
  size_t response_size = 0;
  ssize_t response_len = getline (&response, &response_size, stdin);

  if (response_len <= 0)
    yes = false;
  else
    {
      /* Remove EOL if present as that's not part of the matched response,
         and not matched by $ for example.  */
      if (response[response_len - 1] == '\n')
        response[response_len - 1] = '\0';
      yes = (0 < rpmatch (response));
    }

  free (response);
#else
  /* Test against "^[yY]", hardcoded to avoid requiring getline,
     regex, and rpmatch.  */
  int c = getchar ();
  yes = (c == 'y' || c == 'Y');
  while (c != '\n' && c != EOF)
    c = getchar ();
#endif

  return yes;
}

Если NLS («Поддержка национальных языков» )используется , а не , можно увидеть, что единственный ответ, для которого функция возвращает true , — это ответ, который начинается с символом Yверхнего или нижнего регистра. Любой дополнительный или другой ввод отбрасывается.

Если используется NLS , вызывается функция rpmatch(), чтобы определить, был ли ответ утвердительным или нет. Назначение rpmatch()библиотечной функции NLS состоит в том, чтобы определить, является ли данная строка утвердительной или нет (с поддержкой интернационализации ).

В системах BSD соответствующая функция находится вsrc/bin/cp/utils.c:

/*
 * If the file exists and we're interactive, verify with the user.
 */
int
copy_overwrite(void)
{
        int ch, checkch;

        if (iflag) {
                (void)fprintf(stderr, "overwrite %s? ", to.p_path);
                checkch = ch = getchar();
                while (ch != '\n' && ch != EOF)
                        ch = getchar();
                if (checkch != 'y' && checkch != 'Y')
                        return (0);
        }
        return 1;
}

По сути, это то же самое, что и путь кода без -NLS в коде GNU.

7
27.01.2020, 21:10

Теги

Похожие вопросы