我正在尝试为Ubuntu13.04创建一个安装后脚本,这样在运行时它会自动安装我想要的程序,并应用我想要的设置,比如创建别名以便apt-get=apt-fast、wget=aria2c和sudo=“sudo”。在脚本的开头,我将其设置为检查别名列表,并将其展开以便在脚本中使用(如果存在),以便在整个脚本中使用别名,而不是原始命令。
我希望脚本所做的是测试~/bash_aliases是否存在,如果存在,则查找string1、string2、string3。如果文件存在并且找到了所有字符串,则回显别名已经存在,否则添加缺少的字符串,或者如果不存在包含所有别名的文件,则创建文件。在搜索了一段时间后,我有了一个基本的布局,但我的问题是它的搜索方式是OR或not AND。一旦找到任何字符串,它就会说ok,它们就在那里,并且不会添加丢失的字符串。
这是我到目前为止所知道的:
if [ -f ~/.bash_aliases ]; then
if grep -q "# Additional Alias Definitions" "alias apt-get='apt-fast'" "alias wget='aria2c'" "alias sudo='sudo '" ~/.bash_aliases; then
echo 'Aliases already in place.'
else
printf "%s\n" "# Additional Alias Definitions" "alias apt-get='apt-fast'" "alias wget='aria2c'" "alias sudo='sudo '" >> ~/.bash_aliases
fi
else
printf "%s\n" "# Additional Alias Definitions" "alias apt-get='apt-fast'" "alias wget='aria2c'" "alias sudo='sudo '" >> ~/.bash_aliases
fi我怎样才能让它按我想要的方式工作?
编辑:我设法让它工作,虽然没有完全按照我想要的方式做,但还是能工作……http://paste.progval.net/show/582/
发布于 2013-10-08 13:21:24
我认为你在这里采取了错误的方法:你试图改变其他包提供的文件。这样的事情总是出于好意,但它经常失败,因为没有人能预测其他包将如何变化。
相反,模块化概念已被证明更稳定,它为每个安装的包添加单独的文件,并从中央位置引用这些文件。几年前,第一个遵循这种策略的发行版是openSUSE,这些天来,大多数其他发行版已经采用了这种策略,或者正在切换到这种策略。唯一的例外可能是极简分布在存储空间和/或计算能力上受到限制。对于所有其他情况,要打开和处理的附加文件是可以接受的惩罚,这是由更稳定和透明的安装或设置方案所证明的。
请注意:你的方法当然是可能的,我只是描述了一种被证明更稳定,更方便,更透明的替代方法。
定义一个保存别名定义的单独文件。将该文件放入一个单独的包(rpm或deb)中,作为/etc/profile.d/local-alias或类似文件,确切的路径显然取决于您使用的发行版。该软件包将安装到需要这些定义的任何系统中。这使得安装是透明的,最重要的是一个干净的可逆过程。附加定义的来源在包管理中有很好的文档记录。
现代系统上的安装例程扫描profile.d文件夹,并将执行其中安装的任何脚本。这个过程通常在像/etc/profile这样的文件中定义,请查看您的发行版的详细信息。这种机制使软件包能够在系统中丢弃自己的需求和定义,而每个软件包都不必更改由其他软件包安装的文件,这一过程在长期运行中永远不会稳定,因为成千上万的软件包被安装和删除,所有这些都带来了自己的需求和依赖关系。通常应用此策略的其他示例是将http服务器的模块安装在可选的基础上或特定的shell环境,这些环境通常需要它们自己的一组定义文件。
请注意,我指定的名称和路径是特定于openSUSE的。我几乎没有使用Ubuntu的经验,但您可能会很容易地发现他们实现了这种方法。
https://stackoverflow.com/questions/19239326
复制相似问题