从技术上讲,由于不得不使用一些大型且流行的系统信息工具来应对这些更改的人员,基本上可以归结为:
对于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
请注意,除非他们也进行以下相同的检查,否则如果您注释了一个回购行,则这些测试将是错误的。如果他们执行以下相同的检查,则除了要对许多文件执行而不是对一个文件执行之外,它的精确度也相同。另外,除非他们正在检查所有可能的文件,否则他们可以并且经常这样做,添加重复项,这会引起抱怨,直到删除其中一个为止。
对于sources.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软件包创建的确切文件名。在所有其他情况下,他们将在sources.list.d中创建一个新文件,并以他们想要的方式命名。
当然,要了解您拥有哪些资源,并不是那么容易,因为您比以下任何人都更容易阅读和维护:
cat /etc/sources.list
因此,就我所知,这样做基本上是出于自动更新的目的,并提供了可以提供给用户的简单命令。对于用户而言,这意味着他们必须读取许多文件而不是1个文件才能查看是否已添加回购协议;对于apt而言,这意味着它还必须读取许多文件而不是一个文件。
由于在现实世界中,如果要做好这些工作,就必须支持对所有文件的检查,无论它们的名称是什么,然后测试是否需要执行操作。
但是,如果您做得不好,则只需忽略检查以查看该项目是否在源代码中的某个位置,然后检查文件名即可。我相信这是大多数自动化工具所做的事情,但是从最后开始,我只需要检查所有内容,就可以列出所有文件并根据其中一个文件是否匹配进行操作,唯一的实际结果就是使其变得更加复杂。
批量修改
考虑到运行了许多服务器,我很想编写一份夜间工作脚本,该工作遍历/etc/apt/sources.list.d/并首先检查以确保该项目不在source.list中,然后检查是否存在不,将其添加到sources.list,删除sources.list.d文件,如果已经在sources.list中,则只需删除sources.list.d文件
由于仅使用source.list不会带来任何负面影响,而且不仅简单而且易于维护,因此添加类似的内容可能不是一个坏主意,尤其是在系统管理员做出创造性随机操作的情况下。
如上面的注释所述,inxi -r将为每个文件整齐地打印出活动的仓库,但是当然不会编辑或更改它们,因此仅是解决方案的一半。如果有很多分布,那肯定是学习每个方法的痛苦,这是肯定的,随机性当然是规则而不是例外。