我正在尝试为Ubuntu 13.04制作一个安装后的脚本,以便在运行时它会自动安装我想要的程序并应用我想要的设置,例如创建别名,以便apt-get = apt-fast,wget = aria2c和sudo =“sudo”。在脚本的开头,我将其设置为检查别名列表并将其展开以便在脚本中使用(如果存在),以便在整个脚本中使用别名而不是原始命令。
我希望脚本能做的是测试是否存在〜/ bash_aliases,如果是,则查找string1,string2,string3。如果文件存在且找到所有字符串,则回显别名,否则添加缺少的字符串或创建文件(如果不存在包含所有别名)。搜索了一段时间后,我有一个基本的布局,但我的问题是它搜索为OR而不是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/
答案 0 :(得分:1)
我认为你在这里采取了错误的方法:你试图改变其他包提供的文件。这样的事情总是以良好的意图完成,但是它经常会失败,因为没有人能够预测其他软件包将如何变化。
相反,模块化概念已证明更稳定,它为每个安装的软件包添加单独的文件,并从中心位置引用这些文件。几年前第一个遵循这一策略的分布是openSUSE,现在大多数其他发行版已经适应了这一策略或正在转向它。唯一的例外可能是在存储位置和/或计算能力方面受到限制的简约分布。对于所有其他情况,要打开和处理的附加文件是可接受的惩罚,这通过更稳定和透明的安装或设置方案来证明。
请注意:您的方法当然是可行的,我只是描述了另一种已证明更稳定,方便和透明的方法。
定义一个包含别名定义的单独文件。将该文件放入单独的包(rpm或deb)中作为/etc/profile.d/local-alias
等,确切的路径显然取决于您使用的分发。该软件包将安装到需要这些定义的任何系统中。这使得安装变得透明,最重要的是可以完全恢复的过程。包管理中详细记录了其他定义的来源。
现代系统上的设置例程扫描profile.d
文件夹,并将执行其中安装的任何脚本。此处理通常在/etc/profile
等文件中定义,查看您的分发详细信息。这种机制使软件包能够在系统内部删除自己的需求和定义,而不必更改其他软件包安装的文件,从长远来看,这个过程永远无法稳定运行,需要安装和删除数千个软件包,所有这些都带来了自己的要求和依赖。通常应用此策略的其他示例是用于http服务器安装在可选基础或特定shell环境上的模块,这些环境通常需要它们自己的定义文件集。
请注意,我指定的名称和路径是特定于openSUSE的。我对Ubuntu的经验不多,但您可能很容易发现他们对这种方法的实现。