RM新时代网站-首页

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

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

3天內不再提示

【RT-Thread學習筆記】結合案例學習調試shell腳本

嵌入式物聯(lián)網開發(fā) ? 來源:嵌入式物聯(lián)網開發(fā) ? 作者:嵌入式物聯(lián)網開發(fā) ? 2022-07-29 03:32 ? 次閱讀

1 問題回顧

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

2 shell腳本如何調試

2.1 特別說明

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

2.2 shell腳本如何被啟動的?

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

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

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

2.3 shell腳本的三個調試選項

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

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

2.4 shell腳本的三種調試方式

2.4.1 在shell腳本的首行加選項

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

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

正常示例如下:

  1. #!/bin/shell -evx 的執(zhí)行結果
  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=

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

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ù),用法非常靈活

  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

增加這些調試之后,運行結果如下:

  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賦值之后,腳本就停止運行,退出了,這跟我們之前的分析是一致的。 這個方法對于調試shell的函數(shù)非常有用,值得注意的是,set-xxx需要加在執(zhí)行部分,而不是聲明部分。

3 經驗總結

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

4 更多分享

架構師李肯

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

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

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

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

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

    關注

    1

    文章

    365

    瀏覽量

    23354
  • 腳本
    +關注

    關注

    1

    文章

    389

    瀏覽量

    14858
  • RT-Thread
    +關注

    關注

    31

    文章

    1285

    瀏覽量

    40079
收藏 人收藏

    評論

    相關推薦

    RT-Thread上CAN實踐

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

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

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

    課程上線 - RT-Thread應用開發(fā)實踐課程上線慕課平臺啦!

    我們非常高興地告訴大家,由廣東機電職業(yè)技術學院的老師們制作的,使用《RT-Thread應用開發(fā)實踐》作為教材的課程——嵌入式操作系統(tǒng)應用,正式上線慕課平臺啦!歡迎各位想要系統(tǒng)學習RT-Thread
    的頭像 發(fā)表于 09-14 08:07 ?332次閱讀
    課程上線 - <b class='flag-5'>RT-Thread</b>應用開發(fā)實踐課程上線慕課平臺啦!

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

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

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

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

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

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

    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 ?467次閱讀
    <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 ?441次閱讀
    6月6日杭州站<b class='flag-5'>RT-Thread</b>線下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    【上海】5月25日-基于恩智浦MCX N系列MCU結合RT-Thread的應用與實踐 線下培訓

    5月25號,RT-Thread將攜手恩智浦共同舉辦基于恩智浦MCXN系列MCU結合RT-Thread的應用與實踐線下培訓。我們將為大家?guī)矶髦瞧諱CXN系列MCU的詳細介紹、精彩Demo展示、以及
    的頭像 發(fā)表于 05-13 18:19 ?844次閱讀
    【上?!?月25日-基于恩智浦MCX N系列MCU<b class='flag-5'>結合</b><b class='flag-5'>RT-Thread</b>的應用與實踐 線下培訓

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

    ——王宜懷的教授繼《嵌入式實時操作系統(tǒng)——基于RT-Thread的EAI&IoT系統(tǒng)開發(fā)》之后的又一力作,不僅內容豐富實用,而且講解方式深入淺出,適合不同層次的學習
    的頭像 發(fā)表于 05-11 08:35 ?793次閱讀
    新書發(fā)布——《實時操作系統(tǒng)應用技術:<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 ?437次閱讀
    <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 ?416次閱讀
    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資深嵌入式軟件工程師農曉明老師為您講
    的頭像 發(fā)表于 03-27 11:36 ?814次閱讀
    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 ?526次閱讀
    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現(xiàn)已成為恩智浦注冊合作伙伴(RT-Thread| 簡介合
    的頭像 發(fā)表于 03-14 10:40 ?615次閱讀
    恩智浦半導體正式加入<b class='flag-5'>RT-Thread</b>全球合作伙伴計劃!
    RM新时代网站-首页