0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【RT-Thread学习笔记】bash shell -e参数

嵌入式物联网开发 来源:嵌入式物联网开发 作者:嵌入式物联网开发 2022-07-28 05:20 次阅读

1 前言

1.1 项目背景

这段时间博主在写一些编译构建的脚本,考虑到知识的储备性,之前对bash shell解除最多,而且我们的编译环境是在Linux下进行,所以我优选了bash shell脚本。

1.2 功能描述

期间我写了一个脚本,大致的功能就是获取当前操作系统是MacOS还是Linux,如果是Linux的话,还需要知道是Linux32还是Linux64。

2 场景分析

2.1 脚本实现

我们都知道Linux系统下有个uname命令可以输出当前系统的详细信息,而MacOS上由于它是Unix系统演变来的,所以它也是支持这个命令的。 经过一番研究,我就决定使用uname-a来获取输出信息,然后从输出信息里面检索关键字,进而判断是什么系统。 脚本实现代码如下:

  1. #! /bin/bash -e
  2. function get_os()
  3. {
  4. echo "begin to get OS ..."
  5. os=`uname -a | grep Darwin`
  6. if [ "$os" != "" ]; then
  7. host_os_name=OSX
  8. else
  9. os=`uname -a | grep x86_64`
  10. if [ "$os" != "" ]; then
  11. host_os_name=Linux64
  12. else
  13. host_os_name=Linux32
  14. fi
  15. fi
  16. echo "get OS name: $host_os_name"
  17. }
  18. function do_other_things()
  19. {
  20. echo "do other things ..."
  21. }
  22. get_os
  23. do_other_things
  24. exit 0

2.2 问题复现

从功能逻辑上分析,没有任何问题,结果我在Linux-x64上面一跑,出乎意料了:

  1. bash_shell_e$ ./test_shell_e.sh
  2. begin to get OS ...

感觉脚本压根就没跑完啊?怎么回事?

2.3 问题分析

调试代码,先从逻辑上分析没有问题,再使用万能的print大法,不过再bash shell里面就要用echo了。 通过一行行echo添加log,最终定位到是:

  1. os=`uname -a | grep Darwin`

执行完这句之后,后面的if语句就没跑进去! 但是uname-a|grepDarwin在我的机器上是可以执行的,并不会报错:

  1. bash_shell_e$ uname -a | grep Darwin
  2. bash_shell_e$

虽然是啥也没输出。 我们都知道在bash shell里面是通过echo $?来判断上一条命令执行是否成功的:

  1. bash_shell_e$ echo $?
  2. 1
  3. bash_shell_e$
  4. bash_shell_e$ ls
  5. test_shell_e.sh
  6. bash_shell_e$
  7. bash_shell_e$ echo $?
  8. 0

嗯哼?返回1,这个引起了我的注意,证明这条命令执行的返回是失败的。 回头再看看脚本的开始,我习惯上是写

  1. #! /bin/bash -e

至于为啥带上-e,以前压根就没去考虑过,反正看到linux下的好多系统脚本就是这样写的,咱这样是像标准看齐,没想到还搞出问题了。

2.4 -e究竟是什么含义?

通过查了一些资料,发现这个-e不简单,它可以对每一条执行的shell脚本,自动判断其是否执行成功,如果执行失败,就立即退出整个脚本的执行。 用代码来体现就是,如果不加-e,你需要对一个命令的执行结果判断,就应该这样:

  1. excute_shell_cmd
  2. if [ $? != 0 ]; then
  3. exit 1
  4. fi

而有了-e,就只有这样:

  1. excute_shell_cmd

看,是不是大大简洁了脚本,而不会出现满屏的if-fi。 但是这个带来的最大问题就是,你可能不知道哪条语句就退出了,应该这里退出脚本执行的时候,没有任何输出提示,就好像我的案例场景一样。

2.4 解决办法1

既然知道是-e选项引起的,我去掉试试看:

  1. #! /bin/bash
  2. function get_os()
  3. {
  4. echo "begin to get OS ..."
  5. os=`uname -a | grep Darwin`
  6. if [ "$os" != "" ]; then
  7. host_os_name=OSX
  8. else
  9. os=`uname -a | grep x86_64`
  10. if [ "$os" != "" ]; then
  11. host_os_name=Linux64
  12. else
  13. host_os_name=Linux32
  14. fi
  15. fi
  16. echo "get OS name: $host_os_name"
  17. }
  18. function do_other_things()
  19. {
  20. echo "do other things ..."
  21. }
  22. get_os
  23. do_other_things
  24. exit 0

执行一下:

  1. bash_shell_e$ ./test_shell.sh
  2. begin to get OS ...
  3. get OS name: Linux64
  4. do other things ...

得到了正确的结果,在其他平台上,也得到了正确的结果。

2.5 解决办法2

但是,如果我不想去掉-e呢,有没有什么办法? 经过一番调试,我发现这样是可以的:

  1. #! /bin/bash -e
  2. function get_os()
  3. {
  4. echo "begin to get OS ..."
  5. osx_name=Darwin
  6. linux64_name=x86_64
  7. if [ "`uname -a | grep $osx_name`" != "" ]; then
  8. host_os_name=OSX
  9. elif [ "`uname -a | grep $linux64_name`" != "" ]; then
  10. host_os_name=Linux64
  11. else
  12. host_os_name=Linux32
  13. fi
  14. echo "get OS name: $host_os_name"
  15. }
  16. function do_other_things()
  17. {
  18. echo "do other things ..."
  19. }
  20. get_os
  21. do_other_things
  22. exit 0

输出结果如下:

  1. bash_shell_e$ ./test_shell_ok.sh
  2. begin to get OS ...
  3. get OS name: Linux64
  4. do other things ...

这里的区别在于,直接把uname-a|grepDarwin的执行结果参与if判断,而不是用一个变量去接收返回;这样居然就通过了。

2.6 扩展延伸

有没有更好的方法调试shell脚本呢?而不是满屏的echo? 这个,下次我再发文介绍些高阶手段吧,敬请期待。

3 更多分享

架构师李肯

一个专注于嵌入式IoT领域的架构师。有着近10年的嵌入式一线开发经验,深耕IoT领域多年,熟知IoT领域的业务发展,深度掌握IoT领域的相关技术栈,包括但不限于主流RTOS内核的实现及其移植、硬件驱动移植开发、网络通讯协议开发、编译构建原理及其实现、底层汇编及编译原理、编译优化及代码重构、主流IoT云平台的对接、嵌入式IoT系统的架构设计等等。拥有多项IoT领域的发明专利,热衷于技术分享,有多年撰写技术博客的经验积累,连续多月获得RT-Thread官方技术社区原创技术博文优秀奖,荣获CSDN博客专家、CSDN物联网领域优质创作者、2021年度CSDN&RT-Thread技术社区之星、RT-Thread官方嵌入式开源社区认证专家、RT-Thread 2021年度论坛之星TOP4、华为云云享专家(嵌入式物联网架构设计师)等荣誉。坚信【知识改变命运,技术改变世界】!

本项目的所有测试代码和编译脚本,均可以在我的github仓库01workstation中找到。

欢迎关注我的github仓库01workstation,日常分享一些开发笔记和项目实战,欢迎指正问题。

同时也非常欢迎关注我的专栏,有问题的话,可以跟我讨论,知无不答,谢谢大家。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Shell
    +关注

    关注

    1

    文章

    363

    浏览量

    23252
  • 脚本
    +关注

    关注

    1

    文章

    385

    浏览量

    14810
  • Bash
    +关注

    关注

    0

    文章

    57

    浏览量

    10159
  • RT-Thread
    +关注

    关注

    31

    文章

    1257

    浏览量

    39815
收藏 人收藏

    评论

    相关推荐

    开源共生 商业共赢 | RT-Thread 2024开发者大会报名启动!

    亲爱的RT-Thread开发者我们很高兴地宣布,一年一度的RDC(RT-ThreadDeveloperConference,RT-Thread开发者大会)正式启动报名!2024RT-Threa
    的头像 发表于 10-29 08:06 143次阅读
    开源共生 商业共赢 | <b class='flag-5'>RT-Thread</b> 2024开发者大会报名启动!

    【大连】9月7日RT-Thread巡回线下培训-OpenMV机器视觉

    亲爱的RT-Thread社区成员们:2024年RT-Thread全球开发者线下培训拉开帷幕啦!24年全球巡回培训将覆盖超10座城市及国家,为开发者提供一个深入学习RT-Thread嵌入
    的头像 发表于 09-01 08:02 989次阅读
    【大连】9月7日<b class='flag-5'>RT-Thread</b>巡回线下培训-OpenMV机器视觉

    2024 RT-Thread全球巡回 线下培训火热来袭!

    亲爱的RT-Thread社区成员们:我们非常高兴地宣布,2024年RT-Thread全球开发者线下培训即将拉开帷幕!24年全球巡回培训将覆盖超10座城市及国家,为开发者提供一个深入学习RT-T
    的头像 发表于 08-07 08:35 796次阅读
    2024 <b class='flag-5'>RT-Thread</b>全球巡回 线下培训火热来袭!

    RT-Thread 新里程碑达成——GitHub Star 破万!

    RT-Thread实时操作系统开源项目在GitHub上的star数量突破一万!截止发文,RT-Thread作为实时操作系统在业界Star数量排名第一!仓库地址:https://github.com
    的头像 发表于 07-04 08:35 371次阅读
    <b class='flag-5'>RT-Thread</b> 新里程碑达成——GitHub Star 破万!

    6月6日杭州站RT-Thread线下workshop,探索RT-Thread混合部署新模式!

    6月6日下午我们将在杭州举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深
    的头像 发表于 05-28 08:35 373次阅读
    6月6日杭州站<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    2024 RT-Thread 全球技术大会演讲议程发布!

    RT-ThreadGlobalTechConference(RT-ThreadGTC,RT-Thread全球技术大会)致力于围绕RT-Thread基础软件技术发展、实践创新、开发者能力
    的头像 发表于 05-16 08:34 454次阅读
    2024 <b class='flag-5'>RT-Thread</b> 全球技术大会演讲议程发布!

    RT-Thread混合部署Workshop北京站来啦!

    4月25日,下午我们将在北京举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深
    的头像 发表于 04-19 08:34 379次阅读
    <b class='flag-5'>RT-Thread</b>混合部署Workshop北京站来啦!

    4月25日北京站RT-Thread线下workshop,探索RT-Thread混合部署新模式

    4月25日,下午我们将在北京举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深
    的头像 发表于 04-16 08:35 374次阅读
    4月25日北京站<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式

    4月10日深圳场RT-Thread线下workshop,探索RT-Thread混合部署新模式!

    4月10日我们将在深圳福田举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深嵌入式软件工程师农晓明老师为您讲
    的头像 发表于 03-27 11:36 735次阅读
    4月10日深圳场<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    4月10日深圳场RT-Thread线下workshop,探索RT-Thread混合部署新模式!

    4月10日我们将在深圳福田举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深
    的头像 发表于 03-27 08:34 458次阅读
    4月10日深圳场<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    恩智浦半导体正式加入RT-Thread全球合作伙伴计划!

    前不久,恩智浦半导体正式加入RT-Thread全球合作伙伴计划,成为RT-Thread高级会员合作伙伴。同时,RT-Thread现已成为恩智浦注册合作伙伴(RT-Thread| 简介合
    的头像 发表于 03-14 10:40 551次阅读
    恩智浦半导体正式加入<b class='flag-5'>RT-Thread</b>全球合作伙伴计划!

    【PSoC™62 for RT-ThreadRT-Thread携手英飞凌举办嵌入式网络应用开发沙龙,圆满落幕!

    题的线下沙龙!此次沙龙聚焦使用英飞凌科技PSoC62在RT-Thread Studio平台上进行开发,并结合智能数据网关动手培训为开发者们提供了深入了解英飞凌与学习使用RT-Thread的良好机会,吸引了近150余名工程师报名参
    的头像 发表于 12-14 16:25 508次阅读
    【PSoC™62 for <b class='flag-5'>RT-Thread</b>】<b class='flag-5'>RT-Thread</b>携手英飞凌举办嵌入式网络应用开发沙龙,圆满落幕!

    RT-Thread qemu mps2-an385 bsp移植制作 :系统运行篇

    前面已经让 RT-Thread 进入了 entry 入口函数,并且 调整 链接脚本,自动初始化与 MSH shell 的符号已经预留, 进入了 RT-Thread 的初始化流
    的头像 发表于 11-14 12:27 751次阅读
    <b class='flag-5'>RT-Thread</b> qemu mps2-an385 bsp移植制作 :系统运行篇

    i.MX RT1170:VGLite移植RT-Thread Nano过程讲解(下)

    上篇介绍了如何移植 RT-Thread Nano 内核与 Finsh 控制台到 RT1170。本篇继续介绍如何将 NXP 官方的 VGLite API 移植到 RT-Thread Nano 上。
    的头像 发表于 11-09 11:22 845次阅读

    i.MX RT1170:VGLite移植RT-Thread Nano过程讲解(上)

    RT-Thread 是国人自主研发的开源实时操作系统(RTOS),RT-Thread Nano 是极简版的硬实时内核,内存占用小,移植简单。VGLite 是 NXP 提供的轻量级 2D 图形 API,基于 FreeRTOS 实现。
    的头像 发表于 11-09 11:20 2432次阅读
    i.MX <b class='flag-5'>RT</b>1170:VGLite移植<b class='flag-5'>RT-Thread</b> Nano过程讲解(上)