0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

【RT-Thread學(xué)習(xí)筆記】bash shell -e參數(shù)

嵌入式物聯(lián)網(wǎng)開發(fā) ? 來源:嵌入式物聯(lián)網(wǎng)開發(fā) ? 作者:嵌入式物聯(lián)網(wǎng)開發(fā) ? 2022-07-28 05:20 ? 次閱讀

1 前言

1.1 項目背景

這段時間博主在寫一些編譯構(gòu)建的腳本,考慮到知識的儲備性,之前對bash shell解除最多,而且我們的編譯環(huán)境是在Linux下進行,所以我優(yōu)選了bash shell腳本。

1.2 功能描述

期間我寫了一個腳本,大致的功能就是獲取當(dāng)前操作系統(tǒng)是MacOS還是Linux,如果是Linux的話,還需要知道是Linux32還是Linux64。

2 場景分析

2.1 腳本實現(xiàn)

我們都知道Linux系統(tǒng)下有個uname命令可以輸出當(dāng)前系統(tǒng)的詳細信息,而MacOS上由于它是Unix系統(tǒng)演變來的,所以它也是支持這個命令的。 經(jīng)過一番研究,我就決定使用uname-a來獲取輸出信息,然后從輸出信息里面檢索關(guān)鍵字,進而判斷是什么系統(tǒng)。 腳本實現(xiàn)代碼如下:

  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 問題復(fù)現(xiàn)

從功能邏輯上分析,沒有任何問題,結(jié)果我在Linux-x64上面一跑,出乎意料了:

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

感覺腳本壓根就沒跑完?。吭趺椿厥??

2.3 問題分析

調(diào)試代碼,先從邏輯上分析沒有問題,再使用萬能的print大法,不過再bash shell里面就要用echo了。 通過一行行echo添加log,最終定位到是:

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

執(zhí)行完這句之后,后面的if語句就沒跑進去! 但是uname-a|grepDarwin在我的機器上是可以執(zhí)行的,并不會報錯:

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

雖然是啥也沒輸出。 我們都知道在bash shell里面是通過echo $?來判斷上一條命令執(zhí)行是否成功的:

  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,這個引起了我的注意,證明這條命令執(zhí)行的返回是失敗的。 回頭再看看腳本的開始,我習(xí)慣上是寫

  1. #! /bin/bash -e

至于為啥帶上-e,以前壓根就沒去考慮過,反正看到linux下的好多系統(tǒng)腳本就是這樣寫的,咱這樣是像標(biāo)準(zhǔn)看齊,沒想到還搞出問題了。

2.4 -e究竟是什么含義?

通過查了一些資料,發(fā)現(xiàn)這個-e不簡單,它可以對每一條執(zhí)行的shell腳本,自動判斷其是否執(zhí)行成功,如果執(zhí)行失敗,就立即退出整個腳本的執(zhí)行。 用代碼來體現(xiàn)就是,如果不加-e,你需要對一個命令的執(zhí)行結(jié)果判斷,就應(yīng)該這樣:

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

而有了-e,就只有這樣:

  1. excute_shell_cmd

看,是不是大大簡潔了腳本,而不會出現(xiàn)滿屏的if-fi。 但是這個帶來的最大問題就是,你可能不知道哪條語句就退出了,應(yīng)該這里退出腳本執(zhí)行的時候,沒有任何輸出提示,就好像我的案例場景一樣。

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

執(zhí)行一下:

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

得到了正確的結(jié)果,在其他平臺上,也得到了正確的結(jié)果。

2.5 解決辦法2

但是,如果我不想去掉-e呢,有沒有什么辦法? 經(jīng)過一番調(diào)試,我發(fā)現(xiàn)這樣是可以的:

  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

輸出結(jié)果如下:

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

這里的區(qū)別在于,直接把uname-a|grepDarwin的執(zhí)行結(jié)果參與if判斷,而不是用一個變量去接收返回;這樣居然就通過了。

2.6 擴展延伸

有沒有更好的方法調(diào)試shell腳本呢?而不是滿屏的echo? 這個,下次我再發(fā)文介紹些高階手段吧,敬請期待。

3 更多分享

架構(gòu)師李肯

一個專注于嵌入式IoT領(lǐng)域的架構(gòu)師。有著近10年的嵌入式一線開發(fā)經(jīng)驗,深耕IoT領(lǐng)域多年,熟知IoT領(lǐng)域的業(yè)務(wù)發(fā)展,深度掌握IoT領(lǐng)域的相關(guān)技術(shù)棧,包括但不限于主流RTOS內(nèi)核的實現(xiàn)及其移植、硬件驅(qū)動移植開發(fā)、網(wǎng)絡(luò)通訊協(xié)議開發(fā)、編譯構(gòu)建原理及其實現(xiàn)、底層匯編及編譯原理、編譯優(yōu)化及代碼重構(gòu)、主流IoT云平臺的對接、嵌入式IoT系統(tǒng)的架構(gòu)設(shè)計等等。擁有多項IoT領(lǐng)域的發(fā)明專利,熱衷于技術(shù)分享,有多年撰寫技術(shù)博客的經(jīng)驗積累,連續(xù)多月獲得RT-Thread官方技術(shù)社區(qū)原創(chuàng)技術(shù)博文優(yōu)秀獎,榮獲CSDN博客專家、CSDN物聯(lián)網(wǎng)領(lǐng)域優(yōu)質(zhì)創(chuàng)作者、2021年度CSDN&RT-Thread技術(shù)社區(qū)之星、RT-Thread官方嵌入式開源社區(qū)認(rèn)證專家、RT-Thread 2021年度論壇之星TOP4、華為云云享專家(嵌入式物聯(lián)網(wǎng)架構(gòu)設(shè)計師)等榮譽。堅信【知識改變命運,技術(shù)改變世界】!

本項目的所有測試代碼和編譯腳本,均可以在我的github倉庫01workstation中找到。

歡迎關(guān)注我的github倉庫01workstation,日常分享一些開發(fā)筆記和項目實戰(zhàn),歡迎指正問題。

同時也非常歡迎關(guān)注我的專欄,有問題的話,可以跟我討論,知無不答,謝謝大家。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • Shell
    +關(guān)注

    關(guān)注

    1

    文章

    361

    瀏覽量

    23239
  • 腳本
    +關(guān)注

    關(guān)注

    1

    文章

    384

    瀏覽量

    14799
  • Bash
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    10155
  • RT-Thread
    +關(guān)注

    關(guān)注

    31

    文章

    1251

    瀏覽量

    39755
收藏 人收藏

    評論

    相關(guān)推薦

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

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

    2024 RT-Thread全球巡回 線下培訓(xùn)火熱來襲!

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

    RT-Thread 新里程碑達成——GitHub Star 破萬!

    RT-Thread實時操作系統(tǒng)開源項目在GitHub上的star數(shù)量突破一萬!截止發(fā)文,RT-Thread作為實時操作系統(tǒng)在業(yè)界Star數(shù)量排名第一!倉庫地址:https://github.com
    的頭像 發(fā)表于 07-04 08:35 ?345次閱讀
    <b class='flag-5'>RT-Thread</b> 新里程碑達成——GitHub Star 破萬!

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

    6月6日下午我們將在杭州舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺上實現(xiàn)同時運行RT-Thread和linux,本次workshop邀請到RT-Thread資深
    的頭像 發(fā)表于 05-28 08:35 ?356次閱讀
    6月6日杭州站<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    2024 RT-Thread 全球技術(shù)大會演講議程發(fā)布!

    RT-ThreadGlobalTechConference(RT-ThreadGTC,RT-Thread全球技術(shù)大會)致力于圍繞RT-Thread基礎(chǔ)軟件技術(shù)發(fā)展、實踐創(chuàng)新、開發(fā)者能力
    的頭像 發(fā)表于 05-16 08:34 ?438次閱讀
    2024 <b class='flag-5'>RT-Thread</b> 全球技術(shù)大會演講議程發(fā)布!

    新書發(fā)布——《實時操作系統(tǒng)應(yīng)用技術(shù):RT-Thread與ARM編程實踐》

    ——王宜懷的教授繼《嵌入式實時操作系統(tǒng)——基于RT-Thread的EAI&IoT系統(tǒng)開發(fā)》之后的又一力作,不僅內(nèi)容豐富實用,而且講解方式深入淺出,適合不同層次的學(xué)習(xí)
    的頭像 發(fā)表于 05-11 08:35 ?649次閱讀
    新書發(fā)布——《實時操作系統(tǒng)應(yīng)用技術(shù):<b class='flag-5'>RT-Thread</b>與ARM編程實踐》

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

    4月25日,下午我們將在北京舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺上實現(xiàn)同時運行RT-Thread和linux,本次workshop邀請到RT-Thread資深
    的頭像 發(fā)表于 04-19 08:34 ?370次閱讀
    <b class='flag-5'>RT-Thread</b>混合部署Workshop北京站來啦!

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

    4月25日,下午我們將在北京舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺上實現(xiàn)同時運行RT-Thread和linux,本次workshop邀請到RT-Thread資深
    的頭像 發(fā)表于 04-16 08:35 ?358次閱讀
    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平臺上實現(xiàn)同時運行RT-Thread和linux,本次workshop邀請到RT-Thread資深嵌入式軟件工程師農(nóng)曉明老師為您講
    的頭像 發(fā)表于 03-27 11:36 ?714次閱讀
    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平臺上實現(xiàn)同時運行RT-Thread和linux,本次workshop邀請到RT-Thread資深
    的頭像 發(fā)表于 03-27 08:34 ?440次閱讀
    4月10日深圳場<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    恩智浦半導(dǎo)體正式加入RT-Thread全球合作伙伴計劃!

    前不久,恩智浦半導(dǎo)體正式加入RT-Thread全球合作伙伴計劃,成為RT-Thread高級會員合作伙伴。同時,RT-Thread現(xiàn)已成為恩智浦注冊合作伙伴(RT-Thread| 簡介合
    的頭像 發(fā)表于 03-14 10:40 ?528次閱讀
    恩智浦半導(dǎo)體正式加入<b class='flag-5'>RT-Thread</b>全球合作伙伴計劃!

    【PSoC?62 for RT-ThreadRT-Thread攜手英飛凌舉辦嵌入式網(wǎng)絡(luò)應(yīng)用開發(fā)沙龍,圓滿落幕!

    題的線下沙龍!此次沙龍聚焦使用英飛凌科技PSoC62在RT-Thread Studio平臺上進行開發(fā),并結(jié)合智能數(shù)據(jù)網(wǎng)關(guān)動手培訓(xùn)為開發(fā)者們提供了深入了解英飛凌與學(xué)習(xí)使用RT-Thread的良好機會,吸引了近150余名工程師報名參
    的頭像 發(fā)表于 12-14 16:25 ?502次閱讀
    【PSoC?62 for <b class='flag-5'>RT-Thread</b>】<b class='flag-5'>RT-Thread</b>攜手英飛凌舉辦嵌入式網(wǎng)絡(luò)應(yīng)用開發(fā)沙龍,圓滿落幕!

    RT-Thread qemu mps2-an385 bsp移植制作 :系統(tǒng)運行篇

    前面已經(jīng)讓 RT-Thread 進入了 entry 入口函數(shù),并且 調(diào)整 鏈接腳本,自動初始化與 MSH shell 的符號已經(jīng)預(yù)留, 進入了 RT-Thread 的初始化流
    的頭像 發(fā)表于 11-14 12:27 ?725次閱讀
    <b class='flag-5'>RT-Thread</b> qemu mps2-an385 bsp移植制作 :系統(tǒng)運行篇

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

    上篇介紹了如何移植 RT-Thread Nano 內(nèi)核與 Finsh 控制臺到 RT1170。本篇繼續(xù)介紹如何將 NXP 官方的 VGLite API 移植到 RT-Thread Nano 上。
    的頭像 發(fā)表于 11-09 11:22 ?829次閱讀

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

    RT-Thread 是國人自主研發(fā)的開源實時操作系統(tǒng)(RTOS),RT-Thread Nano 是極簡版的硬實時內(nèi)核,內(nèi)存占用小,移植簡單。VGLite 是 NXP 提供的輕量級 2D 圖形 API,基于 FreeRTOS 實現(xiàn)。
    的頭像 發(fā)表于 11-09 11:20 ?2361次閱讀
    i.MX <b class='flag-5'>RT</b>1170:VGLite移植<b class='flag-5'>RT-Thread</b> Nano過程講解(上)