shell make file

MakeFile

1. .SILENT
出现在目标“.SILENT ”的依赖列表中的文件,make在创建这些文件时,不打印
出重建此文件所执行的命令。同样,给目标“.SILENT ”指定命令行是没有意义的。
没有任何依赖文件的目标“.SILENT ”告诉make在执行过程中不打印任何执行的命令。

https://yq.aliyun.com/articles/45038
2. MakeFile变量
变量的命名字可以包含字符、数字,下划线(可以是数字开头),
但不应该含有“:”、“#”、“=”或是空字符(空格、回车等)。
变量是大小写敏感的,传统的Makefile的变量名是全大写的命名方式,也可以 MakeFile 这种形式。

变量在声明时需要给予初值,而在使用时,需要给在变量名前加上“$”符号,
但最好用小括号“()”或是大括号“{}”把变量给包括起来。
变量会在使用它的地方精确地展开
如果你要使用真实的“$”字符,那么你需要用“$$”来表示。
errno=$$?

$? 可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。
退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1

export ISOWORKSPACE :这个是用来提供该子目录makefile(sub make)中访问的

2 赋值
也就是简单的使用“=”号,在“=”左侧是变量,右侧是变量的值,
右侧中的变量不一定非要是已定义好的值,其也可以使用后面定义的值。
=  延时变量,只有被使用时才展开定义
:= 立即变量,定义时的赋值立即有效
?= 条件变量,当变量为空时才赋值
+= 追加赋值
会得不到中间值 b a b
用 b:= $(a)
只能使用前面已定义好了的变量

3 变量高级用法
第一种是变量值的替换
foo := a.o b.o c.o
bar := $(foo:.o=.c)
另外一种变量替换的技术是以“静态模式”定义的
foo := a.o b.o c.o
bar := $(foo:%.o=%.c)

4 追加变量值
foo += d.o
foo:= $(foo)d.o

5 export
1. 在(parent,上层的)makefile中export出来变量,子makefile中是可以访问的。
2. 而同一级别的makefile(可通过makefile中内置变量MAKELEVEL查看得知当前makefile的levlel),是无法通过export来传递变量的,即一个makefile中export出来一个变量,同一级的另外一个makefile中,是无法访问/得到的。
3. makefile中的export是导出变量到子makfile,而目标对应执行的动作中的export,是属于shell中的export,其作用是导出变量到当前shell。此两个export的作用是不同的。

6 make -c
当make的目标为all时,-C $(KDIR) 指明跳转到内核源码目录下读取那里的Makefile;

7 error 调试
使用$(error) 暂停make执行,并可以打印出元素
$(error -----1-[$(EXTRACTISODIRS)]---)

8 tr -S
删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串
9 cut -d -f
-d : 来定义分隔符,默认为tab键,一般与-f配合使用
-f : 需要选取的字段,根据-d切分的字段集选取,下标从1开始
echo $PATH
echo $PATH | cut -d: -f2
/usr/local/bin

10 shell test 中的一些命令
-eq //等于
-ne //不等于
-gt //大于 (greater )
-lt //小于 (less)
-ge //大于等于
-le //小于等于
-e filename 如果 filename存在,则为真
-d filename 如果 filename为目录,则为真
-f filename 如果 filename为常规文件,则为真
-L filename 如果 filename为符号链接,则为真
-r filename 如果 filename可读,则为真
-w filename 如果 filename可写,则为真
-x filename 如果 filename可执行,则为真
-s filename 如果文件长度不为0,则为真
-h filename 如果文件是软链接,则为真
命令的逻辑关系:
在linux 中 命令执行状态:0 为真,其他为假
逻辑与: &&
第一个条件为假时,第二条件不用再判断,最终结果已经有;
第一个条件为真时,第二条件必须得判断;
逻辑或:||
第一个条件为真时,第二条件不用1再判断,最终结果已有
第一个条件为假的,第二条件必须得判断
shell 特殊变量
$# : 传递给脚本或者函数的参数个数
$n : 传递给脚本或者函数的参数

11. wget 工具常用参数
https://blog.csdn.net/freeking101/article/details/53691481/
wget_fnd="wget -r --no-directories --no-parent -R *.md5 -R *.sha1 -R index.html -R TRANS.TBL* ${ISOPATH}/${line} -P ${wsiso}"
选项 描述
-r 递归下载服务器上所有的目录和文件。由 -l 选项来指定递归深度。
-b 后台下载
-m 制作站点镜像
-c 指定断点续传功能。该功能要求服务器支持断点续传。
-I 指定下载目录列表,可实现批量下载
-A/-R 指定接受/拒绝下载列表,实现选择性地下载
--proxy=on/off 指定是否利用代理服务器进行下载
-t, --tries=NUMBER 最大尝试链接次数 (0 表示无限制,默认为 20 次 )
-nc, --no-clobber 不覆盖已存在的文件
-N, --timestamping 只下载比本地新的文件
-nd --no-directories 不进行目录结构创建
-x, --force-directories 强制创建目录结构
-nH, --no-host-directories 不继承主机目录结构
-P, --directory-prefix=PREFIX 表示下载到哪个目录
-np, --no-parent 不追溯至父目录
-O, --output-document=文件 将文档写入 FILE

12
while read line
do

done < file
read通过输入重定向,把file的第一行所有的内容赋值给变量line,
循环体内的命令一般包含对变量line的处理;
然后循环处理file的第二行、第三行。。。一直到file的最后一行。

13 find PATH -type d
http://blog.chinaunix.net/uid-24648486-id-2998767
根据文件类型来查找文件
-type
f // 普通文件
d //目录文件
l //链接文件
b //块设备文件
c //字符设备文件
p //管道文件
s //socket文件

14 drwxr-xr--
usr group others
u+w u+r u-x
15 touch
最常用用法:touch fileA
如果fileA存在,使用touch指令可更改这个文件或目录的日期时间,包括存取时间和更改时间;
如果fileA不存在,touch指令会在当前目录下新建一个空白文件fileA。
16 cp
-a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。
-d:复制时保留链接。这里所说的链接相当于Windows系统中的快捷方式。
-f:覆盖已经存在的目标文件而不给出提示。
-i:与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答"y"时目标文件将被覆盖。
-p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
-r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
-l:不复制文件,只是生成链接文件。
-v 或 --verbose 显示执行过程

17 压缩 解压缩
#压缩
tar -czvf ***.tar.gz
tar -cjvf ***.tar.bz2
#解压缩
tar -xzvf ***.tar.gz
tar -xjvf ***.tar.bz2


18 伪目标
.PHONY
https://www.cnblogs.com/linhaostudy/p/7200629.html
它用来指定一个假想的工作目标,也就是说它后面的并不是一个实际文件,而且肯定要视为未更新(也就是说条件总是满足,需要处理)
  PHONY 目标并非实际的文件名:只是在显式请求时执行命令的名字。有两种理由需要使用PHONY
目标:1 避免和同名文件冲突(防止存在和PHONY执行目标的名称相同的文件
如果同一个目录下有一个clean文件,那么 make clean的动作将不会执行rm动作;
所以,增加.PHONY伪目标的使用的话,就会忽略目录下clean这个文件,直接执行rm动作;
2伪目标的另一种使用场合时在make的并行和递归执行过程中。
其中subdirs模板表示要编译多个子目录中的工程
19 ~/.rpmmacros
文件用以修改rpm打包的默认路径

20 rpmbuild制作rpm 包
https://blog.csdn.net/u012373815/article/details/73257754
目录名:
BUILD : 编译rpm包的临时目录
BUILDROOT: 编译后生成的软件临时安装目录
RPMS : 最终生成的可安装rpm包的所在目录
SOURCES : 所有源代码和补丁文件的存放目录(tar.gz)
SPECS : 存放.SPEC文件的目录(打包脚本)
SRPMS : 软件最终的rpm源码格式存放路径

21. .SPEC文件
https://blog.csdn.net/lxf310/article/details/17268913
https://www.cnblogs.com/schangech/p/5641108.html
Name: vuf-vxos-stable //rpm包名字
Version: 2.0.6 //包的版本号
Release: 5%{?dist} // 修订号
Summary: VxOS Upgrade Framework //包的简要信息
Vendor: Veritas Technologies LLC //包的供应商
License: Copyright (c) 2017 Veritas Technologies LLC. All rights reserved.
Source0: %{name}-%{version}-%{release}.tar.gz //源码文件
BuildArch: x86_64 //系统平台
BuildRoot: %{name}-%{version}-%{release} //这个是安装或编译时使用的“虚拟目录”,编译过程中的中间存档目录,在生成rpm的过程中,
执行make install时就会把软件安装到上述的路径中,在打包的时候,同样依赖“虚拟目录”为“根目录”进行操作。后面可使用$RPM_BUILD_ROOT 方式引用
Requires: vuf //该rpm包所依赖的软件包名称
Packager: Appliance Solutions //打包者信息
%description
VxOS upgrade VUF configuration
%prep //预处理脚本
%setup -q // 把源码包解压缩, 以最小输出模式
%install //开始把软件安装到虚拟目录中
rm -rf $RPM_BUILD_ROOT
%files //定义需要打包进rpm中的文件或者目录
%defattr(-,root,root)制定包装文件的属性 分别是(mode,owner,group),-表示默认值,对文本文件是0644,可执行文件是0755
%exclude : 列出不想打包到rpm中的文件
%changelog //更变日志
%doc : 需要安装文档
%config :它可以标识配置文件, 这样在升级时用户对配置文件做过的修改就不会丢失。
文件标识 在RPM升级包中是否更新了? 旧版本文件未被用户编辑过 旧版本文件被用户编辑过
默认 No 用新文件覆盖 用新文件覆盖
~ Yes 用新文件覆盖 用新文件覆盖
%config No 用新文件覆盖 保持旧文件
~ Yes 用新文件覆盖 旧文件改名为.rpmsave并复制新文件
%config(noreplace) No 用新文件覆盖 保持旧文件
~ Yes 用新文件覆盖 保持旧文件,新文件安装为.rpmnew

%post // rpm 安装后执行的脚本
%preun rpm卸载前执行的脚本
%postun rpm卸载后执行的脚本

%preun %postun 的区别是什么呢?
前者在升级的时候会执行,后者在升级rpm包的时候不会执行

rpmbuild常用参数:
-bb 只编译二进制rpm包
-bs 只编译源码rpm包
-ba 同时编译二进制和源码rpm包

22 mkdir
-m=mode  为目录指定访问权限,与chmod类似。
  -p  如果目录已经存在,则不会有错误提示。若父目录不存在,将会创建父目录。该选项常用于创建级联目录。
  -v  为每个目录显示提示信息。

23 install
https://blog.csdn.net/chenghuikai/article/details/72471414
–backup[=CONTROL]: 为每个已存在 的目的地文件进行备份
-b: 类似–backup,但不接受任何参数
-c: 此选项不作处理,man文档里写的是ignored
-D, –compare:比较每对源文件和目标文件,如果目的地具有相同的内容和任何指定的所有者,组,权限以及可能的SELinux上下文,那么不要修改目的地
-d, –directory: 所有参数都作为目录处理,而且会创建指定目录的所有主目录
-D: 创建<目的地>前的所有主目录,然后将<来源>复制至<目的地>;在第一种格式中有用
-g, –group=组: 自行设定所属组,而不是进程目前的所属组
-m, –mode=模式: 自行设定权限模式,(像chmod),而不是rwxr-xr-x
-o, –owner: 自行设定权限所有者(只适用于超级用户)
-p, –preserve-timestamp: 以<来源>文件的访问/修改时间作为相应的目的地文件的时间属性
-s, –strip: 用strip命令删除symbol table,只适用于第一及第二种格式
-S, –suffix=后缀: 自定指定备份文件的后缀
-v, –verbose: 处理每个文件/目录时印出名称
-Z CONTEXT, –context=CONTEXT: 设置要用于任何创建的文件和目录的默认SELinux安全上下文。 如果SELinux被禁用,则打印警告并忽略该选项
–help:显示此帮助信息并离开
–version: 显示版本信息并离开

24 getopts
https://blog.csdn.net/legend_x/article/details/21239653
getopts 可以很方便地处理命令行参数,一般格式为:
getopts 的设计目标是在循环中运行,每次执行循环,getopts 就检查下一个命令行参数,
并判断它是否合法。即检查参数是否以 - 开头,后面跟一个包含在 options 中的字母。
如果是,就把匹配的选项字母存在指定的变量 variable 中,并返回退出状态0;
如果 - 后面的字母没有包含在 options 中,就在 variable 中存入一个 ?,并返回退出状态0;
如果命令行中已经没有参数,或者下一个参数不以 - 开头,就返回不为0的退出状态。

25 shell if [-a~z]
https://www.cnblogs.com/liupuLearning/p/6206415.html
Linux_shell条件判断if中的-a到-z的意思
[ -a FILE ] 如果 FILE 存在则为真。
[ -b FILE ] 如果 FILE 存在且是一个块特殊文件则为真。
[ -c FILE ] 如果 FILE 存在且是一个字特殊文件则为真。
[ -d FILE ] 如果 FILE 存在且是一个目录则为真。
[ -e FILE ] 如果 FILE 存在则为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。
[ -g FILE ] 如果 FILE 存在且已经设置了SGID则为真。 [ -h FILE ] 如果 FILE 存在且是一个符号连接则为真。
[ -k FILE ] 如果 FILE 存在且已经设置了粘制位则为真。
[ -p FILE ] 如果 FILE 存在且是一个名字管道(F如果O)则为真。
[ -r FILE ] 如果 FILE 存在且是可读的则为真。
[ -s FILE ] 如果 FILE 存在且大小不为0则为真。
[ -t FD ] 如果文件描述符 FD 打开且指向一个终端则为真。
[ -u FILE ] 如果 FILE 存在且设置了SUID (set user ID)则为真。
[ -w FILE ] 如果 FILE 如果 FILE 存在且是可写的则为真。
[ -x FILE ] 如果 FILE 存在且是可执行的则为真。
[ -O FILE ] 如果 FILE 存在且属有效用户ID则为真。
[ -G FILE ] 如果 FILE 存在且属有效用户组则为真。
[ -L FILE ] 如果 FILE 存在且是一个符号连接则为真。
[ -N FILE ] 如果 FILE 存在 and has been mod如果ied since it was last read则为真。
[ -S FILE ] 如果 FILE 存在且是一个套接字则为真。
[ FILE1 -nt FILE2 ] 如果 FILE1 has been changed more recently than FILE2, or 如果 FILE1 exists and FILE2 does not则为真。
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。
[ -o OPTIONNAME ] 如果 shell选项 “OPTIONNAME” 开启则为真。
[ -z STRING ] “STRING” 的长度为零则为真。
[ -n STRING ] or [ STRING ] “STRING” 的长度为非零 non-zero则为真。

26 sed 's'
sed 's/A/B/'
/^ */ 匹配以空格开头的字符
# 将所有的\ 删除并且在前边加上/
sed 's/^\/*/\//')

27 RPM常用命令:
(01)安装一个包: rpm -ivh
(02) 升级一个包: rpm -Uvh
(03) 移走一个包: rpm -e
-i 安装软件包
--nodeps 不验证软件包的依赖
  -v 可视化,提供更多的详细信息的输出
  -h 显示安装进度
  另外的常用的附带参数为:
   --force 强制安装,即使覆盖其他包的文件也要安装
-a 查询所有已经安装的软件包
-f 查询 文件所属于的软件包
-q 查询软件包(通常用来看下还未安装的软件包)
-l 显示软件包的文件列表
详细选项:
-h (或 --hash) 安装时输出hash记号 (``#'')
--test 只对安装进行测试,并不实际安装。
--percent 以百分比的形式输出安装的进度。
--excludedocs 不安装软件包中的文档文件
--includedocs 安装文档
--replacepkgs 强制重新安装已经安装的软件包
--replacefiles 替换属于其它软件包的文件
--force 忽略软件包及文件的冲突
--noscripts 不运行预安装和后安装脚本
--prefix 将软件包安装到由 指定的路径下
--ignorearch 不校验软件包的结构
--ignoreos 不检查软件包运行的操作系统
--nodeps 不检查依赖性关系
--ftpproxy 用 作为 FTP代理
--ftpport 指定FTP的端口号为
通用选项:
-v 显示附加信息
-vv 显示调试信息
--root 让RPM将指定的路径做为“根目录”,这样预安装程序和后安装程序都会安装到这个目录下
--rcfile 设置rpmrc文件为
--dbpath 设置RPM 资料库存所在的路径为
https://www.cnblogs.com/xxpal/articles/816692.html
原文:https://blog.csdn.net/shuaigexiaobo/article/details/79769175
rpm -qf 列出某一个文件属于哪个rpm包
28 Linux中的标准输入输出
标准输入0 从键盘获得输入 /proc/self/fd/0
标准输出1 输出到屏幕(即控制台) /proc/self/fd/1
错误输出2 输出到屏幕(即控制台) /proc/self/fd/2

/dev/null代表linux的空设备文件,所有往这个文件里面写入的内容都会丢失,俗称“黑洞”

原文:https://blog.csdn.net/zhongqi2513/article/details/78613768

29 tar can also be used to move hierarchies with the command:

example% cd fromdir; tar cf - .| (cd todir; tar xfBp -)

30 createrepo
http://linux.51yip.com/search/createrepo
基本语法:createrepo [option] <directory>
常用参数详解
-u --baseurl <url>
指定Base URL的地址
-o --outputdir <url>
指定元数据的输出位置
-x --excludes <packages>
指定在形成元数据时需要排除的包
-i --pkglist <filename>
指定一个文件,该文件内的包信息将被包含在即将生成的元数据中,格式为每个包信息独占一行,不含通配符、正则,以及范围表达式。
-n --includepkg
通过命令行指定要纳入本地库中的包信息,需要提供URL或本地路径。
-q --quiet
安静模式执行操作,不输出任何信息。
-g --groupfile <groupfile>
指定本地软件仓库的组划分,范例如下:
createrepo -g comps.xml /path/to/rpms
注意:组文件需要和rpm包放置于同一路径下。
-v --verbose
输出详细信息。
-c --cachedir <path>
指定一个目录,用作存放软件仓库中软件包的校验和信息。当createrepo在未发生明显改变的相同仓库文件上持续多次运行时,指定cachedir会明显提高其性能。
--update
如果元数据已经存在,且软件仓库中只有部分软件发生了改变或增减,则可用update参数直接对原有元数据进行升级,效率比重新分析rpm包依赖并生成新的元数据要高很多。
-p --pretty
以整洁的格式输出xml文件。
-d --database
该选项指定使用SQLite来存储生成的元数据,默认项。
32 mkisofs
-a或--all mkisofs通常不处理备份文件。使用此参数可以把备份文件加到映像文件中。
-A<应用程序ID>或-appid<应用程序ID> 指定光盘的应用程序ID。
-abstract<摘要文件> 指定摘要文件的文件名。
-b<开机映像文件>或-eltorito-boot<开机映像文件> 指定在制作可开机光盘时所需的开机映像文件。
-biblio<ISBN文件> 指定ISBN文件的文件名,ISBN文件位于光盘根目录下,记录光盘的ISBN。
-c<开机文件名称> 制作可开机光盘时,mkisofs会将开机映像文件中的全-eltorito-catalog<开机文件名称>全部内容作成一个文件。
-C<盘区编号,盘区编号> 将许多节区合成一个映像文件时,必须使用此参数。
-copyright<版权信息文件> 指定版权信息文件的文件名。
-d或-omit-period 省略文件后的句号。
-D或-disable-deep-relocation ISO 9660最多只能处理8层的目录,超过8层的部分,RRIP会自动将它们设置成ISO 9660兼容的格式。使用-D参数可关闭此功能。
-f或-follow-links 忽略符号连接。
-h 显示帮助。
-hide<目录或文件名> 使指定的目录或文件在ISO 9660或Rock RidgeExtensions的系统中隐藏。
-hide-joliet<目录或文件名> 使指定的目录或文件在Joliet系统中隐藏。
-J或-joliet 使用Joliet格式的目录与文件名称。
-l或-full-iso9660-filenames 使用ISO 9660 32字符长度的文件名。
-L或-allow-leading-dots 允许文件名的第一个字符为句号。
-log-file<记录文件> 在执行过程中若有错误信息,预设会显示在屏幕上。
-m<目录或文件名>或-exclude<目录或文件名> 指定的目录或文件名将不会房入映像文件中。
-M<映像文件>或-prev-session<映像文件> 与指定的映像文件合并。
-N或-omit-version-number 省略ISO 9660文件中的版本信息。
-o<映像文件>或-output<映像文件> 指定映像文件的名称。
-p<数据处理人>或-preparer<数据处理人> 记录光盘的数据处理人。
-print-size 显示预估的文件系统大小。
-quiet 执行时不显示任何信息。
-r或-rational-rock 使用Rock Ridge Extensions,并开放全部文件的读取权限。
-R或-rock 使用Rock Ridge Extensions。
-sysid<系统ID> 指定光盘的系统ID。
-T或-translation-table 建立文件名的转换表,适用于不支持Rock Ridge Extensions的系统上。
-v或-verbose 执行时显示详细的信息。
-V<光盘ID>或-volid<光盘ID> 指定光盘的卷册集ID。
-volset-size<光盘总数> 指定卷册集所包含的光盘张数。
-volset-seqno<卷册序号> 指定光盘片在卷册集中的编号。
-x<目录> 指定的目录将不会放入映像文件中。
-z 建立通透性压缩文件的SUSP记录,此记录目前只在Alpha机器上的Linux有效。
https://blog.csdn.net/taiyang1987912/article/details/42563597

33 Kickstart
Kickstart 是一种被用来执行无人值守操作系统安装和配置的自动化安装方法,
主要被 RHEL(以及其他 Fedora 的副产品,如 CentOS,Oracle Linux 等)所使用。
因此,kickstart 安装方法可使得系统管理员只需考虑需要安装的软件包组和系统的配置,
便可以得到相同的系统,从而省去必须手动安装这些软件包的麻烦。


34 find -exec
 -exec 参数后面跟的是 command 命令,它的终止是以“;”为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠。
 命令:
    find . -type f -exec ls -l {} \;   find 命令匹配到了当前目录下的所有普通文件,并在 -exec 选项中使用 ls -l 命令将它们列出。s


35 playbook
playbook是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。Playbook可以定制配置,可以按照指定的操作步骤有序执行,支持同步和异步方式。值得注意的是playbook是通过YAML格式来进行描述定义的。

36 rpm(选项)(参数)

选项

-a:查询所有套件;
-b<完成阶段><套件档>+或-t <完成阶段><套件档>+:设置包装套件的完成阶段,并指定套件档的文件名称;
-c:只列出组态配置文件,本参数需配合"-l"参数使用;
-d:只列出文本文件,本参数需配合"-l"参数使用;
-e<套件档>或--erase<套件档>:删除指定的套件;
-f<文件>+:查询拥有指定文件的套件;
-h或--hash:套件安装时列出标记;
-i:显示套件的相关信息;
-i<套件档>或--install<套件档>:安装指定的套件档;
-l:显示套件的文件列表;
-p<套件档>+:查询指定的RPM套件档;
-q:使用询问模式,当遇到任何问题时,rpm指令会先询问用户;
-R:显示套件的关联性信息;
-s:显示文件状态,本参数需配合"-l"参数使用;
-U<套件档>或--upgrade<套件档>:升级指定的套件档;
-v:显示指令执行过程;
-vv:详细显示指令执行过程,便于排错。

posted @ 2021-07-13 21:38  安小白learning  阅读(204)  评论(0编辑  收藏  举报