在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    371

    瀏覽量

    23842
  • 腳本
    +關注

    關注

    1

    文章

    395

    瀏覽量

    28308
  • Bash
    +關注

    關注

    0

    文章

    57

    瀏覽量

    10358
  • RT-Thread
    +關注

    關注

    31

    文章

    1352

    瀏覽量

    41393
收藏 人收藏

    評論

    相關推薦
    熱點推薦

    如何將RT-Thread移植到NXP MCUXPressoIDE上

    RT-Thread默認支持的IDE只有IAR 和 Keil, 那如何將RT-Thread移植到NXP MCUXPressoIDE上呢?本文內容比較簡單但稍有瑣碎,希望對有需要的小伙伴有所幫助。
    的頭像 發表于 02-13 10:37 ?1602次閱讀
    如何將<b class='flag-5'>RT-Thread</b>移植到NXP MCUXPressoIDE上

    RT-Thread上CAN實踐

    開箱測試RT-Thread官方已完成了對英飛凌XMC7200EVK的移植,通過shell可以看到做好了uart3的console。本文將介紹如何進行RT-ThreadCan移植。接下來我們要完成CAN_FD的驅動移植,并正常啟動
    的頭像 發表于 11-13 01:03 ?1790次閱讀
    <b class='flag-5'>RT-Thread</b>上CAN實踐

    【S32K146 RT-thread】之 SPI驅動適配

    概述RT-Thread對SPI總線的驅動,抽象出了spibus的設備驅動,我們基于S32K146的硬件學習spibus設備驅動。
    的頭像 發表于 11-01 08:11 ?1067次閱讀
    【S32K146 <b class='flag-5'>RT-thread</b>】之 SPI驅動適配

    開源共生 商業共贏 | RT-Thread 2024開發者大會報名啟動!

    親愛的RT-Thread開發者我們很高興地宣布,一年一度的RDC(RT-ThreadDeveloperConference,RT-Thread開發者大會)正式啟動報名!2024RT-Threa
    的頭像 發表于 10-29 08:06 ?805次閱讀
    開源共生 商業共贏 | <b class='flag-5'>RT-Thread</b> 2024開發者大會報名啟動!

    Nordic-RT-Thread5.1.0移植筆記

    Nordic-RT-Thread5.1.0移植筆記
    的頭像 發表于 10-16 08:09 ?1017次閱讀
    Nordic-<b class='flag-5'>RT-Thread</b>5.1.0移植<b class='flag-5'>筆記</b>

    【成都】9月21日RT-Thread巡回線下培訓-OpenMV機器視覺

    親愛的RT-Thread社區成員們:RT-Thread24年全球巡回培訓將覆蓋超10座城市及國家,為開發者提供一個深入學習RT-Thread嵌入式開發,以及和工程師們線下交流的絕佳機會
    的頭像 發表于 09-13 08:09 ?1338次閱讀
    【成都】9月21日<b class='flag-5'>RT-Thread</b>巡回線下培訓-OpenMV機器視覺

    【大連】9月7日RT-Thread巡回線下培訓-OpenMV機器視覺

    親愛的RT-Thread社區成員們:2024年RT-Thread全球開發者線下培訓拉開帷幕啦!24年全球巡回培訓將覆蓋超10座城市及國家,為開發者提供一個深入學習RT-Thread嵌入
    的頭像 發表于 09-01 08:02 ?2819次閱讀
    【大連】9月7日<b class='flag-5'>RT-Thread</b>巡回線下培訓-OpenMV機器視覺

    【QEMU系列】不用開發板運行RT-Thread指南-ARM架構

    成為一個門檻。本文將詳細介紹如何在QEMU虛擬機的Vexpress-A9平臺上運行RT-Thread,幫助開發者在沒有實際硬件開發板的情況下,輕松體驗和學習RT-Th
    的頭像 發表于 08-09 08:35 ?1345次閱讀
    【QEMU系列】不用開發板運行<b class='flag-5'>RT-Thread</b>指南-ARM架構

    2024 RT-Thread全球巡回 線下培訓火熱來襲!

    親愛的RT-Thread社區成員們:我們非常高興地宣布,2024年RT-Thread全球開發者線下培訓即將拉開帷幕!24年全球巡回培訓將覆蓋超10座城市及國家,為開發者提供一個深入學習RT-T
    的頭像 發表于 08-07 08:35 ?2157次閱讀
    2024 <b class='flag-5'>RT-Thread</b>全球巡回 線下培訓火熱來襲!

    【好書推薦】RT-Thread設備驅動開發指南

    近年來國內芯片產業和物聯網產業的快速崛起,行業發展迫切需要更多人才,尤其需要掌握嵌入式操作系統等底層技術的人才。隨著RT-Thread被更廣泛地應用于行業中,開發者對嵌入式驅動開發的需求越來越
    的頭像 發表于 08-01 08:35 ?1058次閱讀
    【好書推薦】<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 ?654次閱讀
    <b class='flag-5'>RT-Thread</b> 新里程碑達成——GitHub Star 破萬!

    基于 RT-Thread專業版的EtherCAT主站方案

    (一)方案介紹本方案基于RT-Thread專業版,在RT-Thread端集成EtherCAT主站協議,通過EtherCAT對伺服電機或遠程IO進行實時控制,具備傳輸速度快,實時性高,擴展設備靈活等
    的頭像 發表于 06-19 08:35 ?1552次閱讀
    基于 <b class='flag-5'>RT-Thread</b>專業版的EtherCAT主站方案

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

    6月6日下午我們將在杭州舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺上實現同時運行RT-Thread和linux,本次workshop邀請到RT-Thread資深
    的頭像 發表于 05-28 08:35 ?590次閱讀
    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 ?795次閱讀
    2024 <b class='flag-5'>RT-Thread</b> 全球技術大會演講議程發布!

    新書發布——《實時操作系統應用技術:RT-Thread與ARM編程實踐》

    ——王宜懷的教授繼《嵌入式實時操作系統——基于RT-Thread的EAI&IoT系統開發》之后的又一力作,不僅內容豐富實用,而且講解方式深入淺出,適合不同層次的學習
    的頭像 發表于 05-11 08:35 ?1102次閱讀
    新書發布——《實時操作系統應用技術:<b class='flag-5'>RT-Thread</b>與ARM編程實踐》
    主站蜘蛛池模板: 亚洲第一免费视频 | 狠狠色狠狠色综合日日不卡 | 国外精品视频在线观看免费 | 俄罗斯欧美色黄激情 | www成年人视频 | 色综久久| 天天做夜夜操 | 欧美一级片手机在线观看 | 在线免费看高清视频大全 | 欧美极品bbbbⅹxxxx | 久久国产99 | www.综合色| 性刺激的欧美三级视频 | 欧美一区二区三区四区在线观看 | 免费看美女的逼 | 久久久久久久久久久9精品视频 | 3344a毛片在线看 | 一级毛片无毒不卡直接观看 | 精品视频一区二区三区 | 狠狠色噜噜狠狠狠狠黑人 | 亚洲 另类 在线 欧美 制服 | 午夜特级毛片 | 欧美com| 你懂得视频在线 | 中国成熟xxx视频 | 国产高清免费午夜在线视频 | 一级毛片在线看在线播放 | 182tv免费视视频线路一二三 | 日本黄色网址免费 | 日本成人黄色网址 | 欧美福利片在线观看 | 亚洲最大的黄色网址 | 刺激一区| 成 人色 网 站 欧美大片在线观看 | 日韩三级小视频 | 四虎影在线永久免费观看 | 亚洲精品456 | 5252欧美在线观看 | 天天操天天操天天操天天操 | 在线精品91青草国产在线观看 | 国产在线h |