当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 5 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : "dpkg -S firefox"输出为什么有两部分完全相同?
帖子发表于 : 2016-09-13 1:55 

注册: 2013-05-26 6:58
帖子: 2158
系统: Debian 9
送出感谢: 894
接收感谢: 30
"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


_________________
Linux桌面优化综合贴[2017.09.18](欢迎各位补充或指正误区)
[2016.03.10]会C语言但看不懂英文文档的点这里,一个用C语言编写的简陋学习工具
单硬盘通过iso文件实机安装Debian的方法
重启或操作fcitx时失去响应的一个解决方法,不妨试试看


页首
 用户资料  
 
2 楼 
 文章标题 : Re: "dpkg -S firefox"输出为什么有两部分完全相同?
帖子发表于 : 2016-09-13 14:18 
头像

注册: 2011-03-20 13:12
帖子: 4521
地址: 山东省寿光县
系统: Debian
送出感谢: 105
接收感谢: 997
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


_________________
Debian 中文论坛 - forums.debiancn.org
欢迎所有 Debian GNU/Linux 用户


最后由 vickycq 编辑于 2016-09-13 14:59,总共编辑了 1 次


_________________
评价: 3.7% 科学之子
 
页首
 用户资料  
 
3 楼 
 文章标题 : Re: "dpkg -S firefox"输出为什么有两部分完全相同?
帖子发表于 : 2016-09-13 14:37 
头像

注册: 2011-03-20 13:12
帖子: 4521
地址: 山东省寿光县
系统: Debian
送出感谢: 105
接收感谢: 997
进一步验证:

编辑 /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 用户



_________________
评价: 3.7% 科学之子
 
页首
 用户资料  
 
4 楼 
 文章标题 : Re: "dpkg -S firefox"输出为什么有两部分完全相同?
帖子发表于 : 2016-09-13 16:17 

注册: 2013-05-26 6:58
帖子: 2158
系统: Debian 9
送出感谢: 894
接收感谢: 30
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);
    }


_________________
Linux桌面优化综合贴[2017.09.18](欢迎各位补充或指正误区)
[2016.03.10]会C语言但看不懂英文文档的点这里,一个用C语言编写的简陋学习工具
单硬盘通过iso文件实机安装Debian的方法
重启或操作fcitx时失去响应的一个解决方法,不妨试试看


页首
 用户资料  
 
5 楼 
 文章标题 : Re: "dpkg -S firefox"输出为什么有两部分完全相同?
帖子发表于 : 2016-09-13 16:33 
头像

注册: 2011-03-20 13:12
帖子: 4521
地址: 山东省寿光县
系统: Debian
送出感谢: 105
接收感谢: 997
科学之子 写道:
代码做了删减或是不连续?

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 用户



_________________
评价: 3.7% 科学之子
 
页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 5 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译