"dpkg -S firefox"输出为什么有两部分完全相同?

最大的社区版本,Ubuntu的发源地
回复
科学之子
帖子: 2284
注册时间: 2013-05-26 6:58
系统: Debian 9

"dpkg -S firefox"输出为什么有两部分完全相同?

#1

帖子 科学之子 » 2016-09-13 1:55

"dpkg -S firefox"输出为什么有两部分完全相同?

代码: 全选

# dpkg -S firefox |grep -n diver
28:diversion by firefox-esr from: /usr/bin/firefox
29:diversion by firefox-esr to: /usr/bin/firefox.real
96:diversion by firefox-esr from: /usr/bin/firefox
97:diversion by firefox-esr to: /usr/bin/firefox.real
源信息:

代码: 全选

$ cat /etc/apt/sources.list
deb http://mirrors.163.com/debian/ jessie main non-free contrib
deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib
deb http://mirrors.163.com/debian/ jessie-backports main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie-updates main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie-backports main non-free contrib
deb http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib
deb-src http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib

deb http://download.virtualbox.org/virtualbox/debian jessie contrib
头像
vickycq
帖子: 4507
注册时间: 2011-03-20 13:12
系统: Debian
来自: 山东省寿光县
联系:

Re: "dpkg -S firefox"输出为什么有两部分完全相同?

#2

帖子 vickycq » 2016-09-13 14:18

dpkg -S 调用 querycmd.c 中的 searchfiles()
根据参数格式不同进入两个分支:

代码: 全选

if (!strpbrk(thisarg, "*[?\\")) {
      /* Trim trailing ‘/’ and ‘/.’ from the argument if it is not
       * a pattern, just a pathname. */
      varbuf_reset(&path);
      varbuf_add_str(&path, thisarg);
      varbuf_end_str(&path);
      varbuf_trunc(&path, path_trim_slash_slashdot(path.buf));

      namenode = findnamenode(path.buf, 0);
      found += searchoutput(namenode);
    } else {
      iter = files_db_iter_new();
      while ((namenode = files_db_iter_next(iter)) != NULL) {
        if (fnmatch(thisarg,namenode->name,0)) continue;
        printf("namenode->name: %s\n",namenode->name);
        found+= searchoutput(namenode);
      }
      files_db_iter_free(iter);
    }
若参数开头有撇,则为完整路径,进入第一分支 (精确匹配)
$ dpkg -S /usr/bin/firefox
diversion by firefox-esr from: /usr/bin/firefox
diversion by firefox-esr to: /usr/bin/firefox.real
firefox-esr: /usr/bin/firefox
若参数开头没有撇,则为搜索字样,进入 else 分支 (模糊匹配)
$ dpkg -S usr/bin/firefox
diversion by firefox-esr from: /usr/bin/firefox
diversion by firefox-esr to: /usr/bin/firefox.real
diversion by firefox-esr from: /usr/bin/firefox
diversion by firefox-esr to: /usr/bin/firefox.real
firefox-esr: /usr/bin/firefox
firefox-esr: /usr/bin/firefox-esr
其中第一组 diversion by ... from ... to ... 匹配的是 /var/lib/dpkg/diversions 中的字样 usr/bin/firefox
第二组 diversion by ... from ... to ... 匹配的是 /var/lib/dpkg/diversions 中的字样 usr/bin/firefox.real
其中 "firefox-esr: /usr/bin/firefox-esr" 一项也因是否精确匹配而有是否可见的区别。

通过在 querycmd.c 的 searchfiles() 中添加调试输出 printf("Matched namenode.name... 可验证

代码: 全选

      while ((namenode = files_db_iter_next(iter)) != NULL) {
        if (fnmatch(thisarg,namenode->name,0)) continue;
        printf("Matched namenode.name: %s\n",namenode->name);
        found+= searchoutput(namenode);
      }
      files_db_iter_free(iter);
$ dpkg -S usr/bin/firefox
Matched namenode.name: /usr/bin/firefox.real
searchoutput() is called
diversion by firefox-esr from: /usr/bin/firefox
diversion by firefox-esr to: /usr/bin/firefox.real
Matched namenode.name: /usr/bin/firefox
searchoutput() is called
diversion by firefox-esr from: /usr/bin/firefox
diversion by firefox-esr to: /usr/bin/firefox.real
firefox-esr: /usr/bin/firefox
Matched namenode.name: /usr/bin/firefox-esr
searchoutput() is called
firefox-esr: /usr/bin/firefox-esr
上次由 vickycq 在 2016-09-13 14:59,总共编辑 1 次。
Debian 中文论坛 - forums.debiancn.org
欢迎所有 Debian GNU/Linux 用户
头像
vickycq
帖子: 4507
注册时间: 2011-03-20 13:12
系统: Debian
来自: 山东省寿光县
联系:

Re: "dpkg -S firefox"输出为什么有两部分完全相同?

#3

帖子 vickycq » 2016-09-13 14:37

进一步验证:

编辑 /var/lib/dpkg/diversions 添加以下内容

代码: 全选

/usr/bin/AAA
/opt/aaaaa/bin/AAA.aaa
aaaaa
结果:
$ dpkg -S usr/bin/AAA
diversion by aaaaa from: /usr/bin/AAA
diversion by aaaaa to: /opt/aaaaa/bin/AAA.aaa

$ dpkg -S /usr/bin/AAA
diversion by aaaaa from: /usr/bin/AAA
diversion by aaaaa to: /opt/aaaaa/bin/AAA.aaa

$ dpkg -S opt/aaaaa
diversion by aaaaa from: /usr/bin/AAA
diversion by aaaaa to: /opt/aaaaa/bin/AAA.aaa

$ dpkg -S bin/AAA
diversion by aaaaa from: /usr/bin/AAA
diversion by aaaaa to: /opt/aaaaa/bin/AAA.aaa
diversion by aaaaa from: /usr/bin/AAA
diversion by aaaaa to: /opt/aaaaa/bin/AAA.aaa
Debian 中文论坛 - forums.debiancn.org
欢迎所有 Debian GNU/Linux 用户
科学之子
帖子: 2284
注册时间: 2013-05-26 6:58
系统: Debian 9

Re: "dpkg -S firefox"输出为什么有两部分完全相同?

#4

帖子 科学之子 » 2016-09-13 16:17

vickycq 写了:dpkg -S 调用 querycmd.c 中的 searchfiles()
根据参数格式不同进入两个分支:

代码: 全选

if (!strpbrk(thisarg, "*[?\\")) {
      /* Trim trailing ‘/’ and ‘/.’ from the argument if it is not
       * a pattern, just a pathname. */
      varbuf_reset(&path);
      varbuf_add_str(&path, thisarg);
      varbuf_end_str(&path);
      varbuf_trunc(&path, path_trim_slash_slashdot(path.buf));

      namenode = findnamenode(path.buf, 0);
      found += searchoutput(namenode);
    } else {
      iter = files_db_iter_new();
      while ((namenode = files_db_iter_next(iter)) != NULL) {
        if (fnmatch(thisarg,namenode->name,0)) continue;
        printf("namenode->name: %s\n",namenode->name);
        found+= searchoutput(namenode);
      }
      files_db_iter_free(iter);
    }
若参数开头有撇,则为完整路径,进入第一分支 (精确匹配)
$ dpkg -S /usr/bin/firefox
diversion by firefox-esr from: /usr/bin/firefox
diversion by firefox-esr to: /usr/bin/firefox.real
firefox-esr: /usr/bin/firefox
若参数开头没有撇,则为搜索字样,进入 else 分支 (模糊匹配)
$ dpkg -S usr/bin/firefox
diversion by firefox-esr from: /usr/bin/firefox
diversion by firefox-esr to: /usr/bin/firefox.real
diversion by firefox-esr from: /usr/bin/firefox
diversion by firefox-esr to: /usr/bin/firefox.real
firefox-esr: /usr/bin/firefox
firefox-esr: /usr/bin/firefox-esr
其中第一组 diversion by ... from ... to ... 匹配的是 /var/lib/dpkg/diversions 中的字样 usr/bin/firefox
第二组 diversion by ... from ... to ... 匹配的是 /var/lib/dpkg/diversions 中的字样 usr/bin/firefox.real
其中 "firefox-esr: /usr/bin/firefox-esr" 一项也因是否精确匹配而有是否可见的区别。

通过在 querycmd.c 的 searchfiles() 中添加调试输出 printf("Matched namenode.name... 可验证

代码: 全选

      while ((namenode = files_db_iter_next(iter)) != NULL) {
        if (fnmatch(thisarg,namenode->name,0)) continue;
        printf("Matched namenode.name: %s\n",namenode->name);
        found+= searchoutput(namenode);
      }
      files_db_iter_free(iter);
$ dpkg -S usr/bin/firefox
Matched namenode.name: /usr/bin/firefox.real
searchoutput() is called
diversion by firefox-esr from: /usr/bin/firefox
diversion by firefox-esr to: /usr/bin/firefox.real
Matched namenode.name: /usr/bin/firefox
searchoutput() is called
diversion by firefox-esr from: /usr/bin/firefox
diversion by firefox-esr to: /usr/bin/firefox.real
firefox-esr: /usr/bin/firefox
Matched namenode.name: /usr/bin/firefox-esr
searchoutput() is called
firefox-esr: /usr/bin/firefox-esr
您贴出的代码做了删减或是不连续?
我这里:

代码: 全选

if (!strpbrk(thisarg, "*[?\\")) {
      namenode= findnamenode(thisarg, 0);
      found += searchoutput(namenode);
    } else {
      iter = files_db_iter_new();
      while ((namenode = files_db_iter_next(iter)) != NULL) {
        if (fnmatch(thisarg,namenode->name,0)) continue;
        found+= searchoutput(namenode);
      }
      files_db_iter_free(iter);
    }
头像
vickycq
帖子: 4507
注册时间: 2011-03-20 13:12
系统: Debian
来自: 山东省寿光县
联系:

Re: "dpkg -S firefox"输出为什么有两部分完全相同?

#5

帖子 vickycq » 2016-09-13 16:33

科学之子 写了:代码做了删减或是不连续?
2 楼第一个代码块是连续的,是 dpkg 1.18.10 querycmd.c 第 406-422 行
其中 "printf("namenode->name: %s\n",namenode->name);" 一行是自己加的,也就是下文的调试输出 printf("Matched namenode.name... 发帖时忘了去掉。
看来是 dpkg 1.17.27 (jessie) 和 1.18.10 (stretch/sid) 的区别
Debian 中文论坛 - forums.debiancn.org
欢迎所有 Debian GNU/Linux 用户
回复