稀土掘金 稀土掘金

configure语法摘要

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天, 点击查看活动详情

我一直没想好怎么来写 configure 分析这一章节的内容。因为 FFmpeg 的 configure 脚本有 8千行代码,而且这些是 shell 代码,不太方便断点调试,非常复杂。

我意识到 如果 逐行 分析 这 8千行代码,不利于读者阅读。逐行分析 跟 直接给一个 带注释的 configure 脚本是一样的。

所以 configure 这一章,会拆成几个部分来讲解。因为基本上任何代码,都有模块的概念的,一个一个模块分析 是比较好的方式。


Shell 的基本知识推荐一本书 《Linux命令行与shell脚本编程大全》


由于 configure 是 shell 脚本,而 shell 的语法有很多种,假设 shell 的语法有 1 万种,但是 configure 里面只用了 200 种语法。

所以本文先介绍 configure 里面用到的 一些 shell 的基本语法,这些语法学了立马就能用得上的。

可以把本文作为一个 shell 手册查询,不需要从头开始阅读本文,当遇到 configure 的语法没看懂时可以回过头看本文。


1,export ,导出(设置)一个环境变量,在 configure 里面的用法如下:

LC_ALL=C
export LC_ALL

大家可以在 Linux 终端 按顺序 执行一下 下面的命令。

echo $LC_ALL
export LC_ALL=C
echo $LC_ALL

configure-syntax-1-1

从上图可以看出来,刚开始 echo 变量 LC_ALL 的时候是没有内容的,export 之后就有内容了。这个 export 实际上就是设置一个变量的值,但是只在当前终端会话有效,你关闭这个终端再打开这个 LC_ALL 变量就会重新变成没有内容的情况。

至于这个 LC_ALL 变量是干什么的,推荐阅读 这篇文章 《shell脚本中 LC_ALL=C 的含义》。


在 shell 变量里面还有一种也比较常用的设置变量的方式,就是两条命令连一起,这样 设置的变量只对后面的命令生成,对终端会话不生效。代码如下:

TODO:这里找一下 configure 的应用,应该有。



2,unset ,这个是删除一个变量,例如 unset foo


3,${foo%%bar} ,这是一种删除变量最后字符串的用法,示例代码如下:

foo=lsbar
echo ${foo%%bar}

configure-syntax-1-2

如上,%% 会把 最后的 bar 字符删除。

所以我为什么要讲一些语法,是因为 shell 这些语法真的有点奇葩,: %% 这种符号语法 用搜索引擎真的很难搜到说明用法,去翻 shell 手册,又要翻很久。


4,test ,这个是测试命令,可以判断各种条件跟情况,例如判断 目录是否存在,代码如下:

test -d /usr
echo $?
test -d /usr888
echo $?

configure-syntax-1-3

$? 变量代表上一条命令的返回状态。

如上,如果目录不存在,就会返回 非 0。

configure 里面使用 test 的地方是 test -t 1,我用 --help 打印不了 test 命令的文档,但是可以用 man 命令来查看 test 文档,如下:

man test > t.txt

configure-syntax-1-4

因此,-t 就是判断描述符有没打开。


5,: ${ncols:=72} 一开始就加 : 代表不要把结果作为命令来执行,示例代码如下:

configure-syntax-1-5

从上图可以看出,当 ncols 变量的值为空的时候,:= 就会进行赋值成 72,但是由于前面没有加 :,所以导致结果 72 会被作为一个命令执行。

后面 ncols 有值之后,就不会再赋值成 95 了,这就是 := 赋值符号的作用。


6,set -- ,设置 $ 变量的值,用法如下:

set a b c
echo $1 $2 $3

configure-syntax-1-6

但是 configure 里面使用 set 前面加了两个 -- ,这是什么意思呢?请看官方解释,如下:

-- means "don't treat anything following this as an option"

翻译过来就是 不要把后面的参数作为一个选项,你再看下面一个例子就知道这句话什么意思了。如下:

通过 set --help ,可以查看到 set 命令支持的选项,里面有个 -a 选项,如果我们正好想把 $1 设置成 -a 这个字符串,下面这样是不行的。

set -a
echo $1

必须写成这样,前面加上 -- 字符。

set -- -a 
echo $1

运行结果如下:

configure-syntax-1-7


7,set -- 保存变量之后再恢复。在 configure 里面 有 几处地方是 set -- 把 变量内容保存进去 $1$2 ,然后执行一个函数,执行完函数之后再恢复过来。如下:

 set -- $cfg "$dep_all" "$dep_any" "$dep_con" "$dep_sel" "$dep_sgs" "$dep_ifa" "$dep_ifn"
 check_deps $dep_all $dep_any $dep_con $dep_sel $dep_sgs $dep_ifa $dep_ifn
 cfg=$1; dep_all=$2; dep_any=$3; dep_con=$4; dep_sel=$5 dep_sgs=$6; dep_ifa=$7; dep_ifn=$8

这么搞是因为 shell 每一个地方的变量都是全局变量,这个 跟 C 语言不太一样,C 语言是模块化,外部的变量必须传参进去给函数,函数才能用这个变量。要不函数内部只能自己声明这个变量,当然,全局变量例外。

我用一个例子 来演示 ,示例代码如下:

#!/bin/sh
cfg="666"
check_deps(){
  cfg="777"
}
echo "cfg="$cfg
set -- $cfg
check_deps
echo "cfg="$cfg
cfg=$1;
echo "cfg="$cfg

运行结果如下:

configure-syntax-1-8

这是因为 shell 没有局部变量这一说,任何一个地方都是全局变量,所以他要先保存,然后恢复。因为函数内部可能修改了变量的值。


8,-n ,这个语法是判断字符串长度是否为 0 ,有时候前面会省略 test 命令。

玻璃钢生产厂家益阳玻璃钢雕塑生产湖南玻璃钢雕塑加工泉州玻璃钢雕塑长沙商业广场玻璃钢卡通雕塑价格玻璃钢酒店雕塑公司福建玻璃钢人物雕塑会发光的玻璃钢雕塑摆件成都组合式玻璃钢花盆萍乡人物玻璃钢雕塑贵阳多彩玻璃钢雕塑批发商场新年美陈浙江仿铜玻璃钢雕塑订做价格衡水玻璃钢人物雕塑价格菏泽专业玻璃钢仿铜雕塑厂家玻璃钢浮雕不锈钢雕塑定做桂平玻璃钢雕塑公司玻璃钢雕塑设计复原延边公园玻璃钢雕塑深圳商场美陈销售公司肇庆玻璃钢浮雕雕塑嘉兴玻璃钢雪梨雕塑玻璃钢座椅雕塑品牌万源玻璃钢雕塑佛像绵阳玻璃钢人物雕塑都匀浮雕玻璃钢雕塑公司玻璃钢花盆种类潮州玻璃钢雕塑按需定制泰州玻璃钢鹿雕塑深圳艺术商场美陈市场报价玻璃钢景观雕塑加盟香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化