AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 504262
Accepted
Git Gud
Git Gud
Asked: 2019-03-05 04:40:58 +0800 CST2019-03-05 04:40:58 +0800 CST 2019-03-05 04:40:58 +0800 CST

以交互方式复制文件:“cp:覆盖”

  • 772

我试图弄清楚-i交互式选项cp接受哪些词作为输入。

为方便起见,这里是设置实验文件的代码。

touch example_file{1..3}
mkdir example_dir
cp example_file? example_dir
cp -i example_file? example_dir

然后,shell 以交互方式询问每个文件是否应该被覆盖。它似乎接受各种随机输入。

cp: overwrite 'example_dir/example_file1'? q
cp: overwrite 'example_dir/example_file2'? w
cp: overwrite 'example_dir/example_file3'? e

我尝试查看 的源代码cp,但我不知道 C 并且搜索overwrite没有帮助。

据我所知,它接受一些单词作为覆盖的确认,而其他一切都被视为否。问题是甚至像ys似乎被接受为的词yes,所以我不知道什么有效,什么无效。

我想知道这究竟是如何工作的,并通过文档或可理解的源代码片段来证明这一点。

shell cp
  • 2 2 个回答
  • 1299 Views

2 个回答

  • Voted
  1. Best Answer
    Kusalananda
    2019-03-05T04:56:36+08:002019-03-05T04:56:36+08:00

    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()函数来确定响应是否是肯定的。NLS 库函数的目的rpmatch()是确定给定字符串是否是肯定的(支持国际化)。

    在 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;
    }
    

    这本质上与 GNU 代码中的非 NLS 代码路径相同。

    • 7
  2. Bodo
    2019-03-05T04:49:35+08:002019-03-05T04:49:35+08:00

    如果您查看源代码并搜索,interactive您可以看到它设置了x.interactive = I_ASK_USER;,因此您可以在此文件和其他I_ASK_USER检查的文件中搜索。

    在copy.c您会在函数调用附近找到此符号overwrite_ok,并且此函数包含对函数的调用yesno。

    其余的留给读者练习。;-)

    • 2

相关问题

  • 这个命令是如何工作的?mkfifo /tmp/f; 猫/tmp/f | /bin/sh -i 2>&1 | 数控 -l 1234 > /tmp/f

  • FreeBSD 的 sh:列出函数

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • grep -v grep 有什么作用

  • 如何将带有〜的路径保存到变量中?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve