iredmail是一套以postfix为核心的整合邮件系统的安装脚本,可以达到快速部署邮件服务器的目的。为了让自己不遗忘shell的语法,所以闲来无事,学习一下他的代码。

我从官网下载他的最新版,解压后,结构如下:

iRedMail.sh  是开始安装的启动文件,执行bash iRedMail.sh 后就开始安装,我们从这个文件看起。

tmprootdir="$(dirname $0)"
 
dirname的用法是:
 
(1)  带全路径的,例:aguo@auto-test:~> dirname /home/aguo/insert.sql 
         /home/aguo #获得文件所在目录
 
(2)  仅仅是文件名的,例:aguo@auto-test:~> dirname Environment 

.   表示路径就是当前目录

$0 在shell中的意思是当前执行脚本的名称

$() 在shell中起到命令替换的作用,这样tmprootdir的值就为当前执行脚本的目录,在下面要对此目录进行判断

一个命令涉及了3个知识点,看来学习还是能加深印象的。

第二个命令如下:

echo ${tmprootdir} | grep '^/' >/dev/null >&
 
| 管道符 ,管道符左边命令的输出就会作为管道符右边命令的输入。连续使用管道意味着第一个命令的输出会作为 第二个命令的输入,第二个命令的输出又会作为第三个命令的输入,依此类推。
 
grep ‘^/’  查找以/开头的,grep的正则表达式用法
 
>/dev/null >&1  :
 
可以将/dev/null看作"黑洞". 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到
 
1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"
 
2 表示stderr标准错误
 
& 表示等同于的意思,2>&1,表示2的输出重定向等同于1
 
很多shell脚本里都会用到,实际作用就是不让输出任何内容

这个命令的整体作用就是为了查找变量tmprootdir的值中以/开头的,下面会根据状态码进行判断

if [ X"$?" == X"" ]; then
export ROOTDIR="${tmprootdir}"
else
export ROOTDIR="$(pwd)"
fi
 
 
 
export  export命令可以用来设置或显示环境变量。在shell中,当一个变量创建时,只会在当前的shell中有 效,之后创建的子进程不会有该变量。而命令export可以将一个shell变量变成环境变量,在随后创建的子进程中也能访问到该环境变量,但是子进程在 修改了环境变量的值之后,父进程并不能知道,因为子进程将复制父进程的环境变量。因此,当shell退出时,那些在该shell中export出来的环境 变量也会消失。
 
这样的话,接下来的脚本中,ROOTDIR的值就会保留下来
 
[ X"$?" == X"" ]  中的X 是为了防止$?为空的情况下,而设立的,不过网上资料很少提到
$?  执行命令后返回的状态,成功为 0 失败为其他值
if else 判断语句   根据$?的问号的值,来判断脚本的绝对路径 
这个判断是针对多系统的,有的系统里得到的dirname里可能会有绝对路径的值,所以echo ${tmprootdir} | grep '^/' >/dev/null >&1,如果有值的话,就可以直接判断脚本的绝对路径;如果没值的话,就用pwd重新获得。

确定了脚本所在的系统的绝对路径后,后面就可以对一些函数库和全局变量进行调用了,接下来的代码:

cd ${ROOTDIR}

export CONF_DIR="${ROOTDIR}/conf"
export FUNCTIONS_DIR="${ROOTDIR}/functions"
export DIALOG_DIR="${ROOTDIR}/dialog"
export PKG_DIR="${ROOTDIR}/pkgs/pkgs"
export PKG_MISC_DIR="${ROOTDIR}/pkgs/misc"
export SAMPLE_DIR="${ROOTDIR}/samples"
export PATCH_DIR="${ROOTDIR}/patches"
export TOOLS_DIR="${ROOTDIR}/tools" . ${CONF_DIR}/global
. ${CONF_DIR}/core

基本包含了系统以后要用到的所有配置文件和具体的变量文件,global是全局的变量文件  core是核心文件,后面会继续分析,从语法看没什么难的,只有. 需要解释一下

.   ${CONF_DIR}/global  这样就把里面的变量或者函数都引入到了脚本的运行中,后面遇到具体的变量再做分析。

# Check downloaded packages, pkg repository.
[ -f ${STATUS_FILE} ] && . ${STATUS_FILE}

${STATUS_FILE} 变量定义的文件是conf/global中,具体位置如下:

从图中可以看出,该变量的值来自另一变量,继续拿出来分析:

export RUNTIME_DIR="${ROOTDIR}/runtime"
export STATUS_FILE="${RUNTIME_DIR}/install.status"

${ROOTDIR}上面已经分析过了,这是脚本执行的绝对路径,从${STATUS_FILE}词的意思可以理解为这个变量是安装状态的变量,作者定义它是为了判断安装状态。${RUNTIME_DIR},也就是所有后面软件安装时的状态都会以文件形式存放在这个目录里。

[-f  ${STATUS_FILE} ]        -f filename  如果 filename为常规文件,则为真  [ -f /usr/bin/grep ]

&&   &&左边的命令(命令1)返回真(即返回0,成功被执行)后,&&右边的命令(命令2)才能够被执行

显然这句的意思是判断这个状态文件是否存在,如果存在,把该文件里的一些变量值读入到进程中,我觉的这是为了解决安装过程中断后,再次安装时,可以继续安装而设置的。继续下面的语句

if [ X"${status_get_all}" != X"DONE" ]; then
cd ${ROOTDIR}/pkgs/ && bash get_all.sh
if [ X"$?" == X'' ]; then
cd ${ROOTDIR}
else
exit
fi
fi

程序中的${status_get_all},如果这个变量的值不是DONE,那么程序就会进入到PKGS里,执行get_all.sh,文件的具体分析见下面:

get_all.sh下载安装文件的脚本分析

执行完上述脚本,获得了安装包,我们继续分析代码如下:

chmod go+rx /dev/null /dev/*random &>/dev/null

作者在此加了注释,给这些文件读写权限,是为了防止某些系统不支持,而导致安装过程中断。

check_env函数解析

iredmail安装脚本分析(一)---iRedmail.sh的更多相关文章

  1. iredmail安装脚本分析(二)---get_all.sh 文件所在目录为PKGS

    经过上面的一系列分析后,进入到获取安装包的步骤,作者在此处单独写了一个脚本,get_all.sh,我们继续分析这个脚本 _ROOTDIR="$(pwd)" CONF_DIR=&qu ...

  2. iredmail安装脚本分析(三)---conf/global DISTRO值的来源及操作系统的判断

    作者在引入conf/global 文件时,就已经对操作系统的类型进行判断,同时也对DISTRO进行了赋值. 部分代码,如图: 显然文件里的KERNEL_NAME的值就是判断完成的操作系统,具体分析该值 ...

  3. fabric-network_setup.sh安装脚本分析

    在进行镜像安装前,提供了一个sample脚本的下载,可以使用该脚本进行容器的启停.这里对该脚本进行分析. fabric/release/linux-amd64/network_setup.sh 脚本提 ...

  4. fabric镜像安装脚本分析

    #!/bin/bash # # Copyright IBM Corp. All Rights Reserved. # # SPDX-License-Identifier: Apache-2.0 # e ...

  5. Hadoop的shell脚本分析

    你会发现hadoop-daemon.sh用于启动单独的本机节点 而hadoop-daemons.sh 会批量的ssh到别的机器启动 前记: 这些天一直学习hadoop,学习中也遇到了许多的问题,主要是 ...

  6. hadoop启动脚本分析及常见命令

    进程------------------ [hdfs]start-dfs.sh NameNode NN DataNode DN SecondaryNamenode 2NN [yarn]start-ya ...

  7. python3自动安装脚本,python3.x与python2.x共存

    1.前言: python3过程中,通过搜索一些文章参考安装过程发现比较麻烦,而且还出现一些不可预期的报错.python3环境需要升级openssl,所以为了部署到其他环境更方便,写自动安装脚本方式,且 ...

  8. centos 邮件服务 腾讯企业邮箱(免费) 使用iRedmail 需要有公网的centos主机 发邮件协议:smtp 端口25 收邮件协议:pop3 端口110 iredmail安装配置 使用邮箱系统 第三十一节课

    centos   邮件服务  腾讯企业邮箱(免费) 使用iRedmail 需要有公网的centos主机 发邮件协议:smtp 端口25  收邮件协议:pop3 端口110  iredmail安装配置 ...

  9. [转帖]CentOS下iRedMail安装配置

    CentOS下iRedMail安装配置 中文名为艾瑞得邮件,由 rhms 项目更名而来.是针对 Linux 设计的邮件服务器解决方案,是在操作系统安装好后使用的一套 shell 脚本,用于快速部署一套 ...

随机推荐

  1. Fake chat script for website download

    Are you searching for free fake webchat script then you are at the right place go get download your ...

  2. 用markdown学习写出总结

    # PS### 快捷键:CTRL+N(新建)CTRL+1. **切片**- 套索,磁性套索,椭圆,矩形选框.2. **印章** 仿制图章工具,图案图章工具3. 钢笔4. 油漆桶5. 吸管工具, *** ...

  3. hadoop输入分片计算(Map Task个数的确定)

    作业从JobClient端的submitJobInternal()方法提交作业的同时,调用InputFormat接口的getSplits()方法来创建split.默认是使用InputFormat的子类 ...

  4. nginx 安装与配置

    centos7环境下nginx的安装  版本 0.85 tar zxvf nginx.tar.gz cd nginx ./configure // ./configure --help 查看编译选项 ...

  5. OpenLDAP安装

    参考: http://54im.com/openldap/centos-6-yum-install-openldap-phpldapadmin-tls-%E5%8F%8C%E4%B8%BB%E9%85 ...

  6. Spring学习笔记

    Spring 的控制反转:把对象的创建.初始化.销毁等工作交给Spring 容器来做,有spring容器控制对象的生命周期 applicationContext.xml beans --->sp ...

  7. 我创建了一个网站,专门分享公众号的文章 https://asyons.com

    网址:https://asyons.com/,为做个网站,自娱自乐的自明星,但投资也挺大的了,注册了一家公司,公财私章,做账报税,阿里云服务器,全职开发.算上时间价值,按小时,投资过5万了.

  8. C++ 四种类型转换

    在写代码中经常会有很多的隐式类型转换或显式类型转换. 对于隐式的类型转换主要是放生在赋值的时候,讲变量赋值给不同类型的变量的时候就会发生类型转换,如果是宽化转换(即从占字节少的类型向占字节多的类型转换 ...

  9. 遗传算法的C语言实现(一):以非线性函数求极值为例

    以前搞数学建模的时候,研究过(其实也不算是研究,只是大概了解)一些人工智能算法,比如前面已经说过的粒子群算法(PSO),还有著名的遗传算法(GA),模拟退火算法(SA),蚁群算法(ACA)等.当时懂得 ...

  10. org.springframework.beans.MutablePropertyValues.add

    最近在项目中,通过maven引入其他包时,启动报错如下: [ERROR][2016-10-08 14:01:20.716]Context initialization failed[org.sprin ...