我知道这个问题之前已经被问过,但我不接受答案,“你可以清楚地看到自定义添加”。当我添加 ppa 时(我已经很多年没有这样做了),我按下键盘上标有“Enter”的键,这允许我在新条目之前添加一个空行(我什至会添加一个解释性注释,但我是一个科技作家,所以......)。我喜欢我的sources.conf
干净整洁。
/etc/apt/sources.d
意味着我有六个文件需要解析,而不是只有一个。
AFAIK,拥有一个配置文件与 6 个配置文件相比“绝对”没有任何优势(为了论证,也许你有 3 个甚至 2 个,没关系……1 仍然胜过 2)。
有人可以想出一个合理的优势吗,“你可以清楚地看到自定义添加”是一个穷人的借口。
我必须补充一点,我喜欢改变,但是,只有当改变带来好处时。
第一次回复后编辑:
它允许需要自己的存储库的新安装不必搜索平面文件以确保它不会添加重复的条目。
现在,他们必须在目录中搜索受骗者而不是平面文件。除非他们认为管理员不会改变事情......
它允许系统管理员轻松禁用(通过重命名)或删除(通过删除)存储库集,而无需编辑整体文件。
管理员必须 grep 目录来找到合适的文件来重命名,在此之前,他会搜索一个文件并注释掉一行,这是“几乎”任何管理员的 sed 一行。
它允许包维护者给出一个简单的命令来更新存储库位置,而不必担心无意中更改不相关存储库的配置。
我不明白这一点,我“假设”包维护者知道他的存储库的 URL。同样,必须是sed
目录而不是单个文件。
答案1
将每个存储库(或存储库集合)放在自己的文件中可以更轻松地通过手动和编程方式进行管理:
- 它允许需要自己的存储库的新安装不必搜索平面文件以确保它不会添加重复的条目。
- 它允许系统管理员轻松禁用(通过重命名)或删除(通过删除)存储库集,而无需编辑整体文件。
- 它允许包维护者给出一个简单的命令来更新存储库位置,而不必担心无意中更改不相关存储库的配置。
答案2
在技术层面上,作为一个必须在一些大型且流行的系统信息工具中处理这些变化的人,基本上可以归结为:
对于sources.list.d/
# to add
if [[ ! -e /etc/apt/sources.list.d/some_repo.list ]];then
echo 'some repo line for apt' > /etc/apt/sources.list.d/some_repo.list
fi
# to delete
if [[ -e /etc/apt/sources.list.d/some_repo.list ]];then
rm -f /etc/apt/sources.list.d/some_repo.list
fi
请注意,除非他们也执行与下面相同的检查,否则如果您注释掉了存储库行,则这些测试将是错误的。如果他们执行与下面相同的检查,那么它的复杂性是相同的,除了对多个文件而不是一个进行执行。另外,除非他们检查所有可能的文件,否则他们可以并且经常这样做,添加重复的项目,这会导致 apt 抱怨,直到您删除其中一个。
对于来源.list
# to add. Respect commented out lines. Bonus points for uncommenting
# line instead of adding a new line
if [[ -z $( grep -E '\s*[^#]\s*some repo line for apt' /etc/apt/sources.list ) ]];then
echo 'some repo line for apt' >> /etc/apt/sources.list
fi
# to delete. Delete whether commented out or not. Bonus for not
# deleting if commented out, thus respecting the user's wishes
sed -i '/.*some repo line for apt.*/d' /etc/apt/sources.list
Google Chrome 开发人员没有检查 Google Chrome 源是否存在,而是依赖其 Chrome 包创建的确切文件名来显示。在所有其他情况下,他们会在 resources.list.d 中创建一个新文件,并按照他们想要的方式命名。
当然,要查看您拥有哪些资源,这并不那么漂亮,因为没有比以下更容易阅读和维护的了:
cat /etc/sources.list
据我所知,这基本上是为了自动更新,并为用户提供简单的单个命令。对于用户来说,这意味着他们必须读取许多文件而不是 1 个文件来查看是否添加了存储库,而对于 apt 来说,这意味着它必须读取许多文件而不是一个文件。
因为在现实世界中,如果您想做好这一点,则必须支持对所有文件进行检查,无论它们的名称是什么,然后测试是否需要执行要执行的操作。
但是,如果您不打算做得很好,您只需忽略检查该项目是否位于源中的某个位置,而只检查文件名。我相信这就是大多数自动化的东西所做的,但由于最后,我只需检查所有内容,以便我可以列出它并根据这些文件之一是否匹配来采取行动,唯一真正的结果是使它变得更加复杂。
批量编辑
考虑到运行许多服务器,我很想编写一个夜间作业,循环遍历 /etc/apt/sources.list.d/ 并首先检查以确保该项目不在 resources.list 中,然后如果是不,将该项目添加到sources.list,删除sources.list.d文件,如果已经在sources.list中,则删除sources.list.d文件
由于除了简单性和易于维护之外,仅使用 resources.list 没有任何负面影响,因此添加类似的内容可能不是一个坏主意,特别是考虑到系统管理员的创造性随机操作。
正如上面评论中所述, inxi -r 将整齐地打印出每个文件的活动存储库,但当然不会编辑或更改它们,因此这只是解决方案的一半。如果有很多分布,那么学习每个分布是如何做到的是一件很痛苦的事情,这是肯定的,而且不幸的是,随机性肯定是规则而不是例外。
答案3
如果您手动管理服务器,我同意这会让事情变得更加混乱。然而,它有利于程序化管理(即“配置即代码”)。当使用 Puppet、Ansible、Chef 等配置管理软件时,更容易删除或删除目录中的文件并运行apt update
,而不是解析文件以添加或删除某些行。
/etc/apt/sources.list
特别是因为这避免了必须管理来自第三方编写的多个独立模块的单个“文件”资源的内容,例如: 。
由于这个特殊原因,我很欣赏 Ubuntu 广泛使用“.d”目录,即 sudoers.d、rsyslog.d、sysctl.d.、cron.d、logrotate.d 等。
答案4
这允许包添加额外的源而无需求助于脚本。
例如,当您安装 Microsoft 的 Skype 软件包时,skype.com 的源会自动配置为下载更新;从系统中删除 Skype 软件包也会再次禁用此软件包源。
如果您想使用平面文件获得相同的效果,那么Skype的安装脚本将需要修改您的sources.list,这可能会让很多系统管理员感到有点不安。