chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

【RT-Thread學(xué)習(xí)筆記】結(jié)合案例學(xué)習(xí)調(diào)試shell腳本

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

掃碼添加小助手

加入工程師交流群

1 問題回顧

在之前的文章 【shell編程掃盲系列】結(jié)合真實案例分析“bash shell -e”到底是啥意思? 中,我提到了我遇到一個bash shell-e引發(fā)的問題,不瞞大家說,當時我是用echo大法找到出問題的地方,加以修改才解決的。 那么,我們有沒有更加優(yōu)雅的調(diào)試方法,解決這類型的問題呢? 本篇文章將會給出答案。

2 shell腳本如何調(diào)試

2.1 特別說明

本文中提及的shell腳本,無特殊說明的情況下,指的是bash shell。這里做這個強調(diào)的主要原因是,不同的shell的一些基礎(chǔ)語法可能有微小的差異,導(dǎo)致在bash shell中可以跑的腳本,但在別的shell上就跑不了。 這種案例可以參見:【Linux Shell】你知道bash shell和dash shell的區(qū)別嗎?

2.2 shell腳本如何被啟動的?

初次看shell腳本的朋友,一定有所疑問為何大部分shell腳本都是#!/bin/bash開頭??? 這里幫你解除疑問: 因為shell腳本說白了就是一系列命令行組成的一個文本文件,由于各式各樣的腳本非常多,那么該用哪種腳本的語法去解析這個腳本文件呢? 這里就有2種方式:

  • 通過腳本文件的首行,使用#!/bin/bash指定,像這樣就表示它是一個bash shell語法的腳本,應(yīng)該用/bin/bash去解析;
  • 通過啟動的時候,直接用/bin/bash xxx.sh來啟動,這樣就是手動指定腳本的解析器

注意:使用方式1的時候,運行腳本只需要./xxx.sh就可以了,但是方式2卻不行。

2.3 shell腳本的三個調(diào)試選項

從之前的文章中,我們了解了-e選項,其實它還有其他幾個跟調(diào)試相關(guān)的選項,如下所示:

  • -v (verbose 的簡稱) - 告訴 Shell 讀取腳本時顯示所有行,激活詳細模式。
  • -n (noexec 或 no ecxecution 簡稱) - 指示 Shell 讀取所有命令然而不執(zhí)行它們,這個選項激活語法檢查模式。
  • -x (xtrace 或 execution trace 簡稱) - 告訴 Shell 在終端顯示所有執(zhí)行的命令和它們的參數(shù)。 這個選項是啟用 Shell 跟蹤模式。

2.4 shell腳本的三種調(diào)試方式

2.4.1 在shell腳本的首行加選項

這個就跟-e的方式是一樣的,注意加選項的時候,是連著-e起來,比如-evx,而不能這樣-e-v-x。 這里的選項是可以加多個調(diào)試選項。 選項不對報錯:

  1. bash_shell_e$ ./test_shell_e.sh
  2. /bin/bash: - : invalid option

正常示例如下:

  1. #!/bin/shell -evx 的執(zhí)行結(jié)果
  2. /bash_shell_e$ ./test_shell_e.sh
  3. # ~/.bashrc: executed by bash(1) for non-login shells.
  4. # see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
  5. # for examples
  6. # If not running interactively, don't do anything
  7. case $- in
  8. *i*) ;;
  9. *) return;;
  10. esac
  11. + case $- in
  12. + return
  13. #! /bin/bash -evx
  14. function get_os()
  15. {
  16. echo "begin to get OS ..."
  17. os=`uname -a | grep Darwin`
  18. if [ "$os" != "" ]]; then
  19. host_os_name=OSX
  20. else
  21. os=`uname -a | grep x86_64`
  22. if [ "$os" != "" ]; then
  23. host_os_name=Linux64
  24. else
  25. host_os_name=Linux32
  26. fi
  27. fi
  28. echo "get OS name: $host_os_name"
  29. }
  30. function do_other_things()
  31. {
  32. echo "do other things ..."
  33. }
  34. get_os
  35. + get_os
  36. + echo 'begin to get OS ...'
  37. begin to get OS ...
  38. ++ uname -a
  39. ++ grep Darwin
  40. + os=

從這里結(jié)果,我們就可以知道,在執(zhí)行完os=xxx賦值這條語句就退出了,這跟我們使用echo大法得出的結(jié)論是一致的。

2.4.2 手動顯示shell腳本時加選項

即類似這樣: /bin/bash -evx 啟動腳本

  1. bash_shell_e$ /bin/bash -vxe test_shell_e.sh
  2. # ~/.bashrc: executed by bash(1) for non-login shells.
  3. # see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
  4. # for examples
  5. # If not running interactively, don't do anything
  6. case $- in
  7. *i*) ;;
  8. *) return;;
  9. esac
  10. + case $- in
  11. + return
  12. #! /bin/bash -e
  13. function get_os()
  14. {
  15. echo "begin to get OS ..."
  16. os=`uname -a | grep Darwin`
  17. if [ "$os" != "" ]; then
  18. host_os_name=OSX
  19. else
  20. os=`uname -a | grep x86_64`
  21. if [ "$os" != "" ]; then
  22. host_os_name=Linux64
  23. else
  24. host_os_name=Linux32
  25. fi
  26. fi
  27. echo "get OS name: $host_os_name"
  28. }
  29. function do_other_things()
  30. {
  31. echo "do other things ..."
  32. }
  33. get_os
  34. + get_os
  35. + echo 'begin to get OS ...'
  36. begin to get OS ...
  37. ++ uname -a
  38. ++ grep Darwin
  39. + os=

注意:當使用命令行傳遞輸入選項后,腳本文件首行的選項就不生效了,這也是我實踐過程中才發(fā)現(xiàn)的。 如下所示: 我的腳本首行是指定了-e的,但是它依然跑成功了,因為我使用-x啟動,沒有帶-e。

  1. bash_shell_e$ /bin/bash -x test_shell_e.sh
  2. + case $- in
  3. + return
  4. + get_os
  5. + echo 'begin to get OS ...'
  6. begin to get OS ...
  7. ++ uname -a
  8. ++ grep Darwin
  9. + os=
  10. + '[' '' '!=' '' ']'
  11. ++ uname -a
  12. ++ grep x86_64
  13. + os='Linux ubuntu 5.4.0-65-generic #73-Ubuntu SMP Mon Jan 18 17:25:17 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux'
  14. + '[' 'Linux ubuntu 5.4.0-65-generic #73-Ubuntu SMP Mon Jan 18 17:25:17 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux' '!=' '' ']'
  15. + host_os_name=Linux64
  16. + echo 'get OS name: Linux64'
  17. get OS name: Linux64
  18. + do_other_things
  19. + echo 'do other things ...'
  20. do other things ...
  21. + exit 0

2.4.3 通過set命令設(shè)置調(diào)試選項

使用方法如下,它可以在腳本中調(diào)試任意一個函數(shù),用法非常靈活

  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. # open debug option
  23. set -xv
  24. get_os
  25. # close debug option
  26. set +xv
  27. # re-open debug option
  28. set -xv
  29. do_other_things
  30. # close debug option
  31. set +xv
  32. exit 0

增加這些調(diào)試之后,運行結(jié)果如下:

  1. bash_shell_e$ ./test_shell_e_debug.sh
  2. get_os
  3. + get_os
  4. + echo 'begin to get OS ...'
  5. begin to get OS ...
  6. ++ uname -a
  7. ++ grep Darwin
  8. + os=

從這個輸出,我們也可以看到在執(zhí)行完ox=xxx賦值之后,腳本就停止運行,退出了,這跟我們之前的分析是一致的。 這個方法對于調(diào)試shell的函數(shù)非常有用,值得注意的是,set-xxx需要加在執(zhí)行部分,而不是聲明部分。

3 經(jīng)驗總結(jié)

  • 調(diào)試shell腳本有3個選項,-x -n -v 用法各異,靈活使用;
  • 調(diào)試shell腳本的方式也有3種,選用自己熟悉且方便的一種即可,高效排查問題。

4 更多分享

架構(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ū)認證專家、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

    文章

    373

    瀏覽量

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

    關(guān)注

    1

    文章

    407

    瀏覽量

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

    關(guān)注

    32

    文章

    1548

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    首搭RT-Thread程翧車控平臺| RT-Thread程翧 S32K344 快速原型開發(fā)平臺正式上市!| 產(chǎn)品動態(tài)

    在智能汽車邁向高集成與高安全的時代,VCU/ECU開發(fā)正面臨效率與可靠性的雙重考驗。依賴單一硬件或拼湊軟件方案的傳統(tǒng)模式,已成為制約創(chuàng)新的瓶頸。為此,RT-Thread帶來里程碑式的解決方案
    的頭像 發(fā)表于 10-31 11:53 ?592次閱讀
    首搭<b class='flag-5'>RT-Thread</b>程翧車控平臺| <b class='flag-5'>RT-Thread</b>程翧 S32K344 快速原型開發(fā)平臺正式上市!| 產(chǎn)品動態(tài)

    rt-thread studio 導(dǎo)入BSP 失敗怎么解決?

    rt-thread studio 手動導(dǎo)入bsp 失敗。 版本: 2.2.8 構(gòu)建ID: 202405200930 導(dǎo)入的bsp 是直接從rt-thread 代碼倉庫下載的 .log
    發(fā)表于 10-11 11:07

    學(xué)習(xí)強國深度報道 RT-Thread“1+X+N”戰(zhàn)略,國產(chǎn)操作系統(tǒng)賦能高端制造引關(guān)注|媒體視角

    近日,國產(chǎn)嵌入式操作系統(tǒng)領(lǐng)軍企業(yè)RT-Thread睿賽德在工博會發(fā)布的“1+X+N”戰(zhàn)略體系,獲得了國家級權(quán)威媒體平臺“學(xué)習(xí)強國”的重點報道。該報道從產(chǎn)業(yè)高度深入剖析了RT-Thread睿賽德以自主
    的頭像 發(fā)表于 09-29 17:37 ?946次閱讀
    <b class='flag-5'>學(xué)習(xí)</b>強國深度報道 <b class='flag-5'>RT-Thread</b>“1+X+N”戰(zhàn)略,國產(chǎn)操作系統(tǒng)賦能高端制造引關(guān)注|媒體視角

    2025年RT-Thread開發(fā)者巡回培訓(xùn)報名正式啟動!

    親愛的RT-Thread社區(qū)成員們:新程再啟,共赴熱愛!2025年RT-Thread開發(fā)者巡回培訓(xùn)正式啟動報名!今年,我們選擇了西安、武漢、北京、杭州、深圳、上海、成都這7座城市,為大家?guī)?/div>
    的頭像 發(fā)表于 09-27 10:39 ?1231次閱讀
    2025年<b class='flag-5'>RT-Thread</b>開發(fā)者巡回培訓(xùn)報名正式啟動!

    rt-thread studio 2.2.9如何使用最新的RT-Thread v5.2.0 released?

    rt-thread studio2.2.9如何使用最新的RT-Thread v5.2.0 released? 原先以為修改index_all.json,發(fā)現(xiàn)聯(lián)網(wǎng)的時候,會自動覆蓋 另lastet版本
    發(fā)表于 09-16 06:06

    在Ubuntu上開發(fā)基于先楫MCU的RT-Thread應(yīng)用指南

    1、前言RT-ThreadEnv是RT-Thread推出的開發(fā)輔助工具,針對基于RT-Thread操作系統(tǒng)的項目工程,提供編譯構(gòu)建環(huán)境、圖形化系統(tǒng)配置及軟件包管理功能。其內(nèi)置的menuconfig
    的頭像 發(fā)表于 08-29 12:22 ?1271次閱讀
    在Ubuntu上開發(fā)基于先楫MCU的<b class='flag-5'>RT-Thread</b>應(yīng)用指南

    【好書推薦】RT-Thread第20本相關(guān)書籍!《嵌入式實時操作系統(tǒng)RT-Thread原理與應(yīng)用》| 技術(shù)集結(jié)

    01內(nèi)容簡介ContentSummary本書為讀者提供了一個全面、系統(tǒng)的RT-Thread學(xué)習(xí)指南,旨在幫助初學(xué)者及有經(jīng)驗的開發(fā)者掌握RT-Thread實時操作系統(tǒng)和STM32嵌入式微控制器的核心
    的頭像 發(fā)表于 08-24 10:05 ?718次閱讀
    【好書推薦】<b class='flag-5'>RT-Thread</b>第20本相關(guān)書籍!《嵌入式實時操作系統(tǒng)<b class='flag-5'>RT-Thread</b>原理與應(yīng)用》| 技術(shù)集結(jié)

    揭秘!基于RT-Thread探究“優(yōu)先級反轉(zhuǎn)”下的任務(wù)調(diào)度究竟是什么樣的?| 技術(shù)集結(jié)

    本文將基于RT-Thread,結(jié)合RT-Trace調(diào)試器細化到實際任務(wù)調(diào)度的粒度,來調(diào)試并逐步講解“優(yōu)先級反轉(zhuǎn)”的調(diào)度和運行邏輯。如果對
    的頭像 發(fā)表于 08-17 10:07 ?2854次閱讀
    揭秘!基于<b class='flag-5'>RT-Thread</b>探究“優(yōu)先級反轉(zhuǎn)”下的任務(wù)調(diào)度究竟是什么樣的?| 技術(shù)集結(jié)

    RT-Thread 遇上 Rust:安全內(nèi)核 RusT-Thread 的誕生

    大家好,我們是中國科學(xué)技術(shù)大學(xué)操作系統(tǒng)原理與設(shè)計(H)課oooooS小組。這個項目是我們的課程大作業(yè):參考RT-Thread架構(gòu),使用Rust搭建一個原生的嵌入式操作系統(tǒng)內(nèi)核。初識Rust是因為xk
    的頭像 發(fā)表于 08-02 11:03 ?3242次閱讀
    <b class='flag-5'>RT-Thread</b> 遇上 Rust:安全內(nèi)核 RusT-<b class='flag-5'>Thread</b> 的誕生

    RT-Thread榮獲2025優(yōu)秀開源項目 | 新聞速遞

    6月底,RT-Thread睿賽德受邀參與由上海開源信息技術(shù)協(xié)會主辦的2025上海開源創(chuàng)新精英薈。上海市商委副主任張杰出席會議并致辭。RT-Thread嵌入式操作系統(tǒng)項目憑借其卓越的技術(shù)創(chuàng)新與開源生態(tài)
    的頭像 發(fā)表于 07-04 09:04 ?2453次閱讀
    <b class='flag-5'>RT-Thread</b>榮獲2025優(yōu)秀開源項目 | 新聞速遞

    深度剖析 RT-Thread 線程調(diào)度流程

    RT-Thread調(diào)度第一個線程的主要流程分如下:rtthread_startup:RTT的啟動函數(shù),主要負責板級驅(qū)動,調(diào)度器,系統(tǒng)線程初始化,啟動調(diào)度的工作
    的頭像 發(fā)表于 06-25 18:24 ?1473次閱讀
    深度剖析 <b class='flag-5'>RT-Thread</b> 線程調(diào)度流程

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

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

    2025 RT-Thread全球技術(shù)大會議程正式發(fā)布!

    RT-ThreadGlobalTechConference(RT-ThreadGTC,RT-Thread全球技術(shù)大會)是聚焦基礎(chǔ)軟件技術(shù)創(chuàng)新與實踐的嵌入式技術(shù)盛會,持續(xù)推動技術(shù)價值轉(zhuǎn)化
    的頭像 發(fā)表于 05-27 19:28 ?1099次閱讀
    2025 <b class='flag-5'>RT-Thread</b>全球技術(shù)大會議程正式發(fā)布!

    RT-Thread審核團招募: 深度參與開源RTOS社區(qū)治理與演進

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

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

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