0

我正在尝试为 Ubuntu 13.04 制作一个安装后脚本,以便在运行时自动安装我想要的程序并应用我想要的设置,例如创建别名,以便 apt-get=apt-fast、wget=aria2c 和 sudo= “须藤”。在脚本的开头,我将其设置为检查别名列表并展开它以在脚本中使用(如果存在),以便在整个脚本中使用别名而不是原始命令。

我希望脚本做的是测试 ~/bash_aliases 是否存在,如果存在,则查找 string1、string2、string3。如果文件存在并且找到所有字符串,则回显已存在的别名,否则添加缺少的字符串或创建包含所有别名的文件不存在。在搜索了一段时间后,我有了一个基本的布局,但我的问题是它的搜索为 OR not AND。一旦找到任何字符串,它就会说好的,它们在那里并且不会添加丢失的字符串。

这是我到目前为止所拥有的:

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/

4

1 回答 1

1

我认为您在这里采取了错误的方法:您尝试更改其他软件包提供的文件。这样的事情总是出于好意,但它经常失败,因为没有人可以预测其他包将如何变化。

相反,模块化概念已被证明更稳定,它为每个安装的包添加单独的文件,并从中心位置引用这些文件。几年前,第一个遵循这种策略的发行版是 openSUSE,现在大多数其他发行版已经适应了该策略或正在转向它。唯一的例外可能是在存储空间和/或计算能力方面受到限制的简约分布。对于所有其他情况,要打开和处理的附加文件是可接受的惩罚,这可以通过更稳定和透明的安装或设置方案来证明。

请注意:您的方法当然是可能的,我只是描述一种替代方法,它已被证明更稳定、方便和透明。

定义一个单独的文件来保存您的别名定义。将该文件放入单独的包(rpm 或 deb)中/etc/profile.d/local-alias,具体路径显然取决于您使用的发行版。该软件包将安装到需要这些定义的任何系统中。这使得安装过程变得透明,尤其是一个完全可恢复的过程。附加定义的起源在包管理中有很好的记录。

现代系统上的安装程序会扫描profile.d文件夹并执行其中安装的任何脚本。此处理通常定义在类似的文件中/etc/profile,请查看您的分发的详细信息。这种机制使软件包可以在系统中删除自己的要求和定义,而不必更改其他软件包安装的文件,从长远来看,这个过程永远不会稳定,因为成千上万的软件包被安装和删除,所有软件包都自带需求和依赖关系。通常应用此策略的其他示例是安装在可选基础或特定 shell 环境中的 http 服务器的模块,这些环境通常需要它们自己的一组定义文件。

请注意,我指定的名称和路径是特定于 openSUSE 的。我对 Ubuntu 几乎没有经验,但您可能会很容易地发现他们实现了这种方法。

于 2013-10-08T05:21:23.990 回答