Вы можете попробовать разместить запись для эквивалентного DNS в вашем /etc/hosts
, например:
91.189.88.152 archive.ubuntu.com
Если вы посмотрите на исходный код и выполните поиск interactive
, вы увидите, что он устанавливает x.interactive = I_ASK_USER;
, так что вы можете искать в этом и других файлах, где отмечен I_ASK_USER
.
В copy.c
вы найдете этот символ рядом с вызовом функции overwrite_ok
, и эта функция содержит вызов функции yesno
.
Остальное оставлено читателю в качестве упражнения. ;-)
Стандарт 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.