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

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

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

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

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

嵌入式物聯(lián)網(wǎng)開(kāi)發(fā) ? 來(lái)源:嵌入式物聯(lián)網(wǎng)開(kāi)發(fā) ? 作者:嵌入式物聯(lián)網(wǎng)開(kāi)發(fā) ? 2022-07-28 05:20 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1 前言

1.1 項(xiàng)目背景

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

1.2 功能描述

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

2 場(chǎng)景分析

2.1 腳本實(shí)現(xiàn)

我們都知道Linux系統(tǒng)下有個(gè)uname命令可以輸出當(dāng)前系統(tǒng)的詳細(xì)信息,而MacOS上由于它是Unix系統(tǒng)演變來(lái)的,所以它也是支持這個(gè)命令的。 經(jīng)過(guò)一番研究,我就決定使用uname-a來(lái)獲取輸出信息,然后從輸出信息里面檢索關(guān)鍵字,進(jìn)而判斷是什么系統(tǒng)。 腳本實(shí)現(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 問(wèn)題復(fù)現(xiàn)

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

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

感覺(jué)腳本壓根就沒(méi)跑完???怎么回事?

2.3 問(wèn)題分析

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

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

執(zhí)行完這句之后,后面的if語(yǔ)句就沒(méi)跑進(jìn)去! 但是uname-a|grepDarwin在我的機(jī)器上是可以執(zhí)行的,并不會(huì)報(bào)錯(cuò):

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

雖然是啥也沒(méi)輸出。 我們都知道在bash shell里面是通過(guò)echo $?來(lái)判斷上一條命令執(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,這個(gè)引起了我的注意,證明這條命令執(zhí)行的返回是失敗的。 回頭再看看腳本的開(kāi)始,我習(xí)慣上是寫(xiě)

  1. #! /bin/bash -e

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

2.4 -e究竟是什么含義?

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

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

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

  1. excute_shell_cmd

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

2.4 解決辦法1

既然知道是-e選項(xiàng)引起的,我去掉試試看:

  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é)果,在其他平臺(tái)上,也得到了正確的結(jié)果。

2.5 解決辦法2

但是,如果我不想去掉-e呢,有沒(méi)有什么辦法? 經(jīng)過(guò)一番調(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判斷,而不是用一個(gè)變量去接收返回;這樣居然就通過(guò)了。

2.6 擴(kuò)展延伸

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

3 更多分享

架構(gòu)師李肯

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

本項(xiàng)目的所有測(cè)試代碼和編譯腳本,均可以在我的github倉(cāng)庫(kù)01workstation中找到。

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

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

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

    關(guān)注

    1

    文章

    372

    瀏覽量

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

    關(guān)注

    1

    文章

    397

    瀏覽量

    28413
  • Bash
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

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

    關(guān)注

    32

    文章

    1393

    瀏覽量

    41724
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    揭秘RT-Thread上的AUTOSAR CP系統(tǒng)

    本文探討了RT-Thread與AUTOSARCP的融合,解決車載ECU開(kāi)發(fā)中實(shí)時(shí)性、安全性與靈活性的平衡問(wèn)題。通過(guò)分層安全內(nèi)核(rt-safetyos/autoos)和工具鏈整合,兼容AUTOSAR
    的頭像 發(fā)表于 06-23 20:22 ?1693次閱讀
    揭秘<b class='flag-5'>RT-Thread</b>上的AUTOSAR CP系統(tǒng)

    RT-Thread審核團(tuán)招募: 深度參與開(kāi)源RTOS社區(qū)治理與演進(jìn)

    全球開(kāi)發(fā)者招募:RT-Thread審核團(tuán)(ReviewTeam)正式開(kāi)放申請(qǐng)!在開(kāi)源的世界里,代碼審查(CodeReview)是保證軟件質(zhì)量、促進(jìn)技術(shù)交流的關(guān)鍵環(huán)節(jié)。RT-Thread作為全球領(lǐng)先
    的頭像 發(fā)表于 05-21 18:02 ?584次閱讀
    <b class='flag-5'>RT-Thread</b>審核團(tuán)招募: 深度參與開(kāi)源RTOS社區(qū)治理與演進(jìn)

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

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

    從開(kāi)源中來(lái)到開(kāi)源中去-RT-Thread北京社區(qū)篇

    RT-Thread今年全域推行不同區(qū)域社區(qū)網(wǎng),通過(guò)建立區(qū)域社區(qū)網(wǎng),構(gòu)建更加緊密聯(lián)系的開(kāi)源社區(qū),實(shí)現(xiàn)更廣泛的開(kāi)源資源共享,讓更多的RT-Thread開(kāi)發(fā)者受益。今年8月份RT-Thread正式啟動(dòng)北京
    的頭像 發(fā)表于 11-29 01:05 ?445次閱讀
    從開(kāi)源中來(lái)到開(kāi)源中去-<b class='flag-5'>RT-Thread</b>北京社區(qū)篇

    RT-Thread上CAN實(shí)踐

    開(kāi)箱測(cè)試RT-Thread官方已完成了對(duì)英飛凌XMC7200EVK的移植,通過(guò)shell可以看到做好了uart3的console。本文將介紹如何進(jìn)行RT-ThreadCan移植。接下來(lái)我們要完成CAN_FD的驅(qū)動(dòng)移植,并正常啟動(dòng)
    的頭像 發(fā)表于 11-13 01:03 ?2020次閱讀
    <b class='flag-5'>RT-Thread</b>上CAN實(shí)踐

    【S32K146 RT-thread】之 SPI驅(qū)動(dòng)適配

    概述RT-Thread對(duì)SPI總線的驅(qū)動(dòng),抽象出了spibus的設(shè)備驅(qū)動(dòng),我們基于S32K146的硬件學(xué)習(xí)spibus設(shè)備驅(qū)動(dòng)。
    的頭像 發(fā)表于 11-01 08:11 ?1246次閱讀
    【S32K146 <b class='flag-5'>RT-thread</b>】之 SPI驅(qū)動(dòng)適配

    開(kāi)源共生 商業(yè)共贏 | RT-Thread 2024開(kāi)發(fā)者大會(huì)報(bào)名啟動(dòng)!

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

    Nordic-RT-Thread5.1.0移植筆記

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

    【成都】9月21日RT-Thread巡回線下培訓(xùn)-OpenMV機(jī)器視覺(jué)

    親愛(ài)的RT-Thread社區(qū)成員們:RT-Thread24年全球巡回培訓(xùn)將覆蓋超10座城市及國(guó)家,為開(kāi)發(fā)者提供一個(gè)深入學(xué)習(xí)RT-Thread嵌入式開(kāi)發(fā),以及和工程師們線下交流的絕佳機(jī)會(huì)
    的頭像 發(fā)表于 09-13 08:09 ?1599次閱讀
    【成都】9月21日<b class='flag-5'>RT-Thread</b>巡回線下培訓(xùn)-OpenMV機(jī)器視覺(jué)

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

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

    【武漢】9月7日RT-Thread巡回線下培訓(xùn)-RTduino-10分鐘上手嵌入式

    親愛(ài)的RT-Thread社區(qū)成員們:2024年RT-Thread全球開(kāi)發(fā)者線下培訓(xùn)拉開(kāi)帷幕啦!24年全球巡回培訓(xùn)將覆蓋超10座城市及國(guó)家,為開(kāi)發(fā)者提供一個(gè)深入學(xué)習(xí)RT-Thread嵌入
    的頭像 發(fā)表于 08-31 08:05 ?736次閱讀
    【武漢】9月7日<b class='flag-5'>RT-Thread</b>巡回線下培訓(xùn)-RTduino-10分鐘上手嵌入式

    【QEMU系列】不用開(kāi)發(fā)板運(yùn)行RT-Thread指南-ARM架構(gòu)

    成為一個(gè)門檻。本文將詳細(xì)介紹如何在QEMU虛擬機(jī)的Vexpress-A9平臺(tái)上運(yùn)行RT-Thread,幫助開(kāi)發(fā)者在沒(méi)有實(shí)際硬件開(kāi)發(fā)板的情況下,輕松體驗(yàn)和學(xué)習(xí)RT-Th
    的頭像 發(fā)表于 08-09 08:35 ?1535次閱讀
    【QEMU系列】不用開(kāi)發(fā)板運(yùn)行<b class='flag-5'>RT-Thread</b>指南-ARM架構(gòu)

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

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

    【好書(shū)推薦】RT-Thread設(shè)備驅(qū)動(dòng)開(kāi)發(fā)指南

    近年來(lái)國(guó)內(nèi)芯片產(chǎn)業(yè)和物聯(lián)網(wǎng)產(chǎn)業(yè)的快速崛起,行業(yè)發(fā)展迫切需要更多人才,尤其需要掌握嵌入式操作系統(tǒng)等底層技術(shù)的人才。隨著RT-Thread被更廣泛地應(yīng)用于行業(yè)中,開(kāi)發(fā)者對(duì)嵌入式驅(qū)動(dòng)開(kāi)發(fā)的需求越來(lái)越
    的頭像 發(fā)表于 08-01 08:35 ?1257次閱讀
    【好書(shū)推薦】<b class='flag-5'>RT-Thread</b>設(shè)備驅(qū)動(dòng)開(kāi)發(fā)指南

    RT-Thread 新里程碑達(dá)成——GitHub Star 破萬(wàn)!

    RT-Thread實(shí)時(shí)操作系統(tǒng)開(kāi)源項(xiàng)目在GitHub上的star數(shù)量突破一萬(wàn)!截止發(fā)文,RT-Thread作為實(shí)時(shí)操作系統(tǒng)在業(yè)界Star數(shù)量排名第一!倉(cāng)庫(kù)地址:https://github.com
    的頭像 發(fā)表于 07-04 08:35 ?741次閱讀
    <b class='flag-5'>RT-Thread</b> 新里程碑達(dá)成——GitHub Star 破萬(wàn)!
    主站蜘蛛池模板: 怡红院亚洲怡红院首页 | 国产午夜在线观看视频 | 国产网站免费观看 | 日韩亚洲欧美日本精品va | 日本亚洲精品成人 | 日韩亚洲欧洲在线com91tv | 奇米影视婷婷 | 国产资源在线播放 | 久久亚洲精品国产亚洲老地址 | 黄网免费观看 | 中文字幕一区精品欧美 | 亚洲成人99| 中文永久免费看电视网站入口 | 特黄毛片 | 色多多视频在线观看免费大全 | 欧洲亚洲国产精华液 | 69色综合| 男人的午夜天堂 | 久久精品国产夜色 | 免费国产成人午夜私人影视 | 最近最新中文字幕6页 | 亚洲国产精品乱码一区二区三区 | 成人国产激情福利久久精品 | www.91在线播放| 亚洲区中文字幕 | 久久毛片视频 | 五月天婷婷网址 | 久久精品波多野结衣 | 天天做天天爽天天谢 | 中文天堂最新版资源新版天堂资源 | 最近2018中文字幕免费看手机 | 久久综合精品视频 | 亚洲成网777777国产精品 | 你懂的在线免费视频 | 黄色美女网站免费 | 成人国产精品毛片 | 美女黄页网站免费进入 | h小视频在线观看网 | 2021天天干| 人人草人人爽 | 亚洲一区亚洲二区 |