网站制作在哪找/网站制作河南

网站制作在哪找,网站制作河南,vr功能网站建设,股票网站怎么做author: hjjdebug date: 2025年 02月 14日 星期五 17:16:12 CST description: ffmpeg configure 研究1 ./configure 命令行参数的分析 文章目录 1 configure 对命令行参数的分析,在4019行1.1 函数名称: is_in1.2. 函数名称: enable1.3. 函数名称: set_all 2 执行退出判断的关键…

author: hjjdebug
date: 2025年 02月 14日 星期五 17:16:12 CST
description: ffmpeg configure 研究1
./configure 命令行参数的分析


文章目录

    • 1 configure 对命令行参数的分析,在4019行
      • 1.1 函数名称: is_in
      • 1.2. 函数名称: enable
      • 1.3. 函数名称: set_all
    • 2 执行退出判断的关键代码:
      • 2.1. 函数名称: map
      • 2.2 函数名称: die_license_disabled
      • 2.3 函数名称 enabled()
    • 3. 小测试代码
    • 4.执行结果 $ ./1.sh
    • 5.小结:
      • 小结1: 命令行参数分析过程概括.
      • 小结2: bash脚本的本质是什么?

详细分析了 ffmpeg 下执行
./configure --enable-libx264
libx264 is gpl and --enable-gpl is not specified.
程序退出的过程

如果说在命令行上有 --enable-libx264 而没有 --enable-gpl 就退出,
用c 写也就寥寥几句,
libx264_enable=false,gpl_enable=fale;
for(int i=0;i<argc;i++)
{
if(strcmp(arg[i],“–enable-libx264”)0) libx264_enable=true;
if(strcmp(arg[i],“–enable-gpl”)0) gpl_enable=true;
}
if(libx264_enable
true && gpl_enable
false) exit(1)

如果用bash 又应该怎么写呢?
如果只是实现上边的功能,bash 也可以写的很简单, 但在configure 文件中就不是那样写了.
而是有一个复杂的架构,
为什么?因为它要支持一些复杂的功能.

所以该博客就是来了解这个简单的功能是如何在复杂的架构上实现的.
让我们能窥斑见豹. 别被它庞大的架构吓唬注了.
这些是bash编程最基本的东西, 就从此开始吧.

1 configure 对命令行参数的分析,在4019行

for opt do
因为 opt 后面没有 in 参数, 实际上就是 in “ @ " , 代码处于顶层 , @",代码处于顶层, @",代码处于顶层,@就是命令行参数,此时
$opt = --enable-libx264
case 语句会匹配到4087行
–enable-?|–disable-?)
eval ( e c h o " (echo " (echo"opt” | sed ‘s/–/action=/;s/-/ option=/;s/-/_/g’)
if is_in $option $COMPONENT_LIST; then
test $action = disable && action=unset
eval $action $$(toupper ${option%s})_LIST
elif is_in $option $CMDLINE_SELECT; then
$action $option
else
die_unknown $opt
fi

bash 在每次执行命令前要进行8大变换. 其是也是很简单的.
大括号扩展 {} , 把形如 {1…5} 扩展为 1 2 3 4 5
波浪线扩展 ~ , 把~扩展为你的家目录
变量扩展 , 简单方式就是 {} , 简单方式就是 ,简单方式就是var样式, 就是变量引用和变量替换
算术扩展 $(()) , 数学运算在这里进行
命令替换 $()或 ``, 这里可以调用命令,先执行命令
分词分割 IFS , 按照空格,tab,回车来分割成单词
路径扩展 * ? [] , 把*展开匹配任意字符,?匹配0或1个字符,[]匹配指定字符
引号去除 , 去除其中的双引号,单引号

把该行信息都收拾一遍叫扫描,然后再交给bash去执行命令,
eval ( e c h o " (echo " (echo"opt" | sed ‘s/–/action=/;s/-/ option=/;s/-//g’)
eval 语句会进行2次扫描. 即扩展了一遍还要再扩展一遍,所以有$$(…)之类的写法
执行第一遍扫描,进行变量扩展
eval $(echo --enable-libx264 | sed 's/–/action=/;s/-/ option=/;s/-/
/g’)
,进行命令替换
eval action=enable option=libx264

运行eval命令,执行第二遍扫描,(此例第一遍已经扩展干净了,第二遍没有要改变的.)
action=enable option=libx264
这条语句交给bash执行,就是定义了2个变量,并赋值.
elif is_in $option $CMDLINE_SELECT; then
$action o p t i o n l i b x 264 在 option libx264 在 optionlibx264CMDLINE_SELECT 中被发现,会执行 enable libx264 函数


1.1 函数名称: is_in

输入参数: 列表
输出参数:
返回值: 0(成功), 1(失败,假)
描述: 把第一个参数作为值, 依次与后续参数做比较,如果想等,返回成功,全部不成功,返回失败.


is_in(){
value=$1 # 第一个参数为value
shift
for var in KaTeX parse error: Expected 'EOF', got '#' at position 7: *; do #̲ 后续参数与value相比
[ $var = KaTeX parse error: Expected 'EOF', got '&' at position 9: value ] &̲& return 0 # 相同…value被扩展为libx264, $CMDLINE_SELECT 被扩展为一堆字符串, 其中包含libx264, 所以其返回为成功.
$action $option 被扩展为:
enable libx264


1.2. 函数名称: enable

输入参数: 列表
输出参数: 无
返回值: 无
描述: 把参数都做为变量,其值设置为"yes"


enable(){
set_all yes $*
}
执行结果, 把libx264 设置为了 yes, 等价与 libx264=yes


1.3. 函数名称: set_all

输入参数: 列表
输出参数: 无
返回值: 无
描述: 把第一个参数作为value, 其余的参数都作为变量用$value赋值


set_all(){
value=$1 # 第一个参数为value,
shift # 移除第一个参数
for var in $*; do
eval v a r = var= var=value # 其余参数都设置为$value
done
}

注意: 调试时打印pr value 是没有意义的, pr $value才是对变量的引用.

2 执行退出判断的关键代码:

map “die_license_disabled gpl” $EXTERNAL_LIBRARY_GPL_LIST $EXTERNAL_LIBRARY_GPLV3_LIST
$EXTERNAL_LIBRARY_GPL_LIST 变量在1721行有定义,包括libx264,libx265及其它模块
该语句功能. 检查一系列模块,如果enable 了模块而没有enable gpl, 就退出.


2.1. 函数名称: map

输入参数: 列表
输出参数: 无
描述: 把第一个参数作为命令, 后续参数依次作为$v参数,来执行第一条命令


map(){
m=$1 # 把die_license_disabled gpl 赋值给m
shift
for v; do eval $m; done # 把后面的参数依次送给v, 执行 $m,即执行die_license_disabled gpl 函数
}


2.2 函数名称: die_license_disabled

输入参数: 函数调用参数 1 , 全局参数 1, 全局参数 1,全局参数v
输出参数: 无
功能描述: 判断第1个参数(对应“gpl”,“nonfree”)是否enabled,如果已经enabled,则正常退出;
否则判断$v 参数是否 enabled, 如果为真则打印错误信息并退出(die 函数)
注意: 不满足条件时会退出程序.


die_license_disabled() {
enabled $1 || { enabled KaTeX parse error: Expected 'EOF', got '&' at position 3: v &̲& die "v is $1 and --enable-$1 is not specified."; }
}
命令可以作为map 的第一个参数. 该命令接受的参数是$1 和 $v


2.3 函数名称 enabled()

输入参数: 一个参数
输出参数: 无
返回值: 0或1
描述: 对参数$1 判断其值是否是"yes"


enabled(){
test “${1#!}” = “$1” && op=“=” || op=“!=” # 该句设置op为等号或不等号
eval test “x$${1#!}” $op “xyes” # 运行test返回真值或假值.
}
${1#!}是$1变量去除从开始到!止部分,$1无!则不会去除任何东西.

3. 小测试代码

为了对enabled() 函数,die() 及颜色设置有更深入理解,我写了如下测试函数

$ cat 1.sh
#!/bin/bash
enabled(){test "${1#!}" = "$1" && op="=" || op="!=" # 根据第一个参数是否首字符为!为op赋值=或者!=eval test "x\$${1#!}" $op "xyes"  # 测试变量的值是否为yes
}
if test -t 1 && which tput >/dev/null 2>&1; thenncolors=$(tput colors)if test -n "$ncolors" && test $ncolors -ge 8; thenbold_color=$(tput bold)warn_color=$(tput setaf 3)    # 设置前景色为黄(3)error_color=$(tput setaf 1)   # 设置前景色为红(1) , set attr foregroudreset_color=$(tput sgr0)      # 恢复颜色, set groud 0fi# 72 used instead of 80 since that's the default of prncols=$(tput cols)
fi
: ${ncols:=72}  # :就是空操作, 退出总是成功 ${var:=}, 如果ncols 没有值,就给72,否则保持不变logfile="1.log"
log(){echo "$@" >> $logfile
}
die(){log "$@"echo "$error_color$bold_color$@$reset_color" # 设置红色,加重的颜色,显示$@ 然后颜色再恢复
}abc=yes
enabled abc && echo "abc enabled" || echo "abc not enabled"
enabled abb && echo "abb enabled" || echo "abb not enabled"die "I hope this is red"

4.执行结果 $ ./1.sh

abc enabled
abb not enabled
I hope this is red

5.小结:

小结1: 命令行参数分析过程概括.

对于 --enable-libx64 参数而言,它是一个动词-名词的结构,首先用sed将它分为2部分.
把动词作为函数,把名字作为参数执行函数, 实现把名词作为变量进行赋值.
命令行参数分析完后, 对变量进行数值判断,不满足条件则退出程序.

小结2: bash脚本的本质是什么?

bash脚本命令. 就是一个命令的集合体.
命令就是你在控制台下与机器交互输入的命令
你在命令行下所做的操作, 用bash脚本都可以完成.
命令是带参数的.
参数是可以用变量来存储的.
参数经过8大扩展再传递给命令
引入变量和函数可以简化人机的接口,使少敲几个字符就给计算机说明白了.
函数也是由命令集合来构成,支持参数传递,为完成特定功能而编写.
变量和函数的灵活性也增加了代码的复杂性.

所以bash脚本就是不断的执行预定的命令. 不用你在控制台下手敲了.
常在bash下工作的人, 用脚本编程简化维护等工作也是很自然的了.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/895846.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux操作系统:从分布式计算到容器化的实践

Linux集群与高可用性技术&#xff1a;从分布式计算到容器化的实践 摘要 随着云计算和大数据技术的飞速发展&#xff0c;Linux集群和高可用性技术已成为现代IT架构的核心组成部分。本文以幽默风趣的方式&#xff0c;深入探讨了Linux集群技术&#xff08;如Hadoop、Spark等分布…

STM32 外部中断和NVIC嵌套中断向量控制器

目录 背景 外部中断/事件控制器(EXTI) 主要特性 功能说明 外部中断线 嵌套向量中断控制器 特性 ‌中断线&#xff08;Interrupt Line&#xff09; 中断线的定义和作用 STM32中断线的分类和数量 优先级分组 抢占优先级&#xff08;Preemption Priority&#xff09; …

《深度学习》——ResNet网络

文章目录 ResNet网络ResNet网络实例导入所需库下载训练数据和测试数据设置每个批次的样本个数判断是否使用GPU定义残差模块定义ResNet网络模型导入GPU定义训练函数定义测试函数创建损失函数和优化器训练测试数据结果 ResNet网络 ResNet&#xff08;Residual Network&#xff0…

为什么要学习AI、掌握AI技能有什么用?

随着人工智能的迅速的发展&#xff0c;DeepSeek的爆火&#xff0c;加之目前就业环境的走向&#xff0c;越来越多的职场朋友开始关注到AI的发展&#xff0c;重视AI技能的掌握。不少同学都会问&#xff1a;“职场人为什么要学习AI、掌握AI技能&#xff1f;” 为什么要学AI 现…

1-知识图谱-概述和介绍

知识图谱&#xff1a;浙江大学教授 陈华军 知识图谱 1课时 http://openkg.cn/datasets-type/ 知识图谱的价值 知识图谱是有什么用&#xff1f; 语义搜索 问答系统 QA问答对知识图谱&#xff1a;结构化图 辅助推荐系统 大数据分析系统 自然语言理解 辅助视觉理解 例…

零基础学QT、C++(一)安装QT

目录 如何快速学习QT、C呢&#xff1f; 一、编译器、项目构建工具 1、编译器&#xff08;介绍2款&#xff09; 2、项目构建工具 二、安装QT 1、下载QT安装包 2、运行安装包 3、运行QT creator 4、导入开源项目 总结 闲谈 如何快速学习QT、C呢&#xff1f; 那就是项目驱动法&…

STM32外设SPI FLASH应用实例

STM32外设SPI FLASH应用实例 1. 前言1.1 硬件准备1.2 软件准备 2. 硬件连接3. 软件实现3.1 SPI 初始化3.2 QW128 SPI FLASH 驱动3.3 乒乓存储实现 4. 测试与验证4.1 数据备份测试4.2 数据恢复测试 5 实例5.1 参数结构体定义5.2 存储参数到 SPI FLASH5.3 从 SPI FLASH 读取参数5…

Fiddler笔记

文章目录 一、与F12对比二、核心作用三、原理四、配置1.Rules:2.配置证书抓取https包3.设置过滤器4、抓取App包 五、模拟弱网测试六、调试1.线上调试2.断点调试 七、理论1.四要素2.如何定位前后端bug 注 一、与F12对比 相同点&#xff1a; 都可以对http和https请求进行抓包分析…

利用分治策略优化快速排序

1. 基本思想 分治快速排序&#xff08;Quick Sort&#xff09;是一种基于分治法的排序算法&#xff0c;采用递归的方式将一个数组分割成小的子数组&#xff0c;并通过交换元素来使得每个子数组元素按照特定顺序排列&#xff0c;最终将整个数组排序。 快速排序的基本步骤&#…

idea日常报错之UTF-8不可映射的字符

目录 一、UTF-8不可映射的字符的解决 1、出现这种报错的情形 2、具体解决办法 前言&#xff1a; 在我们日常代码编写的时候可能会遇到各式各样的错误&#xff0c;有时候并不是你改动了代码&#xff0c;而是莫名其妙就出现的报错&#xff0c;今天我就遇到一个在maven编译的时候…

人工智能技术-基于长短期记忆(LSTM)网络在交通流量预测中的应用

人工智能技术-基于长短期记忆&#xff08;LSTM&#xff09;网络在交通流量预测中的应用 基于人工智能的智能交通管理系统 随着城市化进程的加快&#xff0c;交通问题日益严峻。为了解决交通拥堵、减少交通事故、提高交通管理效率&#xff0c;人工智能&#xff08;AI&#xff…

HTTP FTP SMTP TELNET 应用协议

1. 标准和非标准的应用协议 标准应用协议&#xff1a; 由标准化组织&#xff08;如 IETF&#xff0c;Internet Engineering Task Force&#xff09;制定和维护&#xff0c;具有广泛的通用性和互操作性。这些协议遵循严格的规范和标准&#xff0c;不同的实现之间可以很好地进行…

Matlab离线安装硬件支持包的方法

想安装支持树莓派的包&#xff0c;但是发现通过matlab安装需要续订维护服务 可以通过离线的方式安装。 1. 下载SupportSoftwareDownloader Support Software Downloader - MATLAB & Simulink 登录账号 选择对应的版本 2. 选择要安装的包 3.将下载的包copy到安装目录下 …

Django REST Framework (DRF) 中用于构建 API 视图类解析

Django REST Framework (DRF) 提供了丰富的视图类&#xff0c;用于构建 API 视图。这些视图类可以分为以下几类&#xff1a; 1. 基础视图类 这些是 DRF 中最基础的视图类&#xff0c;通常用于实现自定义逻辑。 常用类 APIView&#xff1a; 最基本的视图类&#xff0c;所有其…

137,【4】 buuctf web [SCTF2019]Flag Shop

进入靶场 都点击看看 发现点击work会增加&#xffe5; 但肯定不能一直点下去 抓包看看 这看起来是一个 JWT&#xff08;JSON Web Token&#xff09;字符串。JWT 通常由三部分组成&#xff0c;通过点&#xff08;.&#xff09;分隔&#xff0c;分别是头部&#xff08;Header&…

twisted实现MMORPG 游戏数据库操作封装设计与实现

在设计 MMORPG&#xff08;大规模多人在线角色扮演游戏&#xff09;时&#xff0c;数据库系统是游戏架构中至关重要的一部分。数据库不仅承担了游戏中各种数据&#xff08;如玩家数据、物品数据、游戏世界状态等&#xff09;的存储和管理任务&#xff0c;还必须高效地支持并发访…

【R语言】聚类分析

聚类分析是一种常用的无监督学习方法&#xff0c;是将所观测的事物或者指标进行分类的一种统计分析方法&#xff0c;其目的是通过辨认在某些特征上相似的事物&#xff0c;并将它们分成各种类别。R语言提供了多种聚类分析的方法和包。 方法优点缺点适用场景K-means计算效率高需…

超全Deepseek资料包,deepseek下载安装部署提示词及本地部署指南介绍

该资料包涵盖了DeepSeek模型的下载、安装、部署以及本地运行的详细指南&#xff0c;适合希望在本地环境中高效运行DeepSeek模型的用户。资料包不仅包括基础的安装步骤&#xff0c;还提供了68G多套独立部署视频教程教程&#xff0c;针对不同硬件配置的模型选择建议&#xff0c;以…

python旅游推荐系统+爬虫+可视化(协同过滤算法)

✅️基于用户的协同过滤算法 ✅️有后台管理 ✅️2w多数据集 这个旅游数据分析推荐系统采用了Python语言、Django框架、MySQL数据库、requests库进行网络爬虫开发、机器学习中的协同过滤算法、ECharts数据可视化技术&#xff0c;以实现从网站抓取旅游数据、个性化推荐和直观展…

HarmonyNext上传用户相册图片到服务器

图片选择就不用说了&#xff0c;直接用 无须申请权限 。 上传图片&#xff0c;步骤和android对比稍微有点复杂&#xff0c;可能是为了安全性考虑&#xff0c;需要将图片先拷贝到缓存目录下面&#xff0c;然后再上传&#xff0c;当然你也可以转成Base64&#xff0c;然后和服务…