衡阳派盒市场营销有限公司

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

完善資料讓更多小伙伴認(rèn)識你,還能領(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é)合真實(shí)案例分析“bash shell -e”到底是啥意思? 中,我提到了我遇到一個bash shell-e引發(fā)的問題,不瞞大家說,當(dāng)時我是用echo大法找到出問題的地方,加以修改才解決的。 那么,我們有沒有更加優(yōu)雅的調(diào)試方法,解決這類型的問題呢? 本篇文章將會給出答案。

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

2.1 特別說明

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

2.2 shell腳本如何被啟動的?

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

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

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

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

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

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

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

2.4.1 在shell腳本的首行加選項(xiàng)

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

  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腳本時加選項(xiàng)

即類似這樣: /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=

注意:當(dāng)使用命令行傳遞輸入選項(xiàng)后,腳本文件首行的選項(xiàng)就不生效了,這也是我實(shí)踐過程中才發(fā)現(xiàn)的。 如下所示: 我的腳本首行是指定了-e的,但是它依然跑成功了,因?yàn)槲沂褂?span style="background-color:rgb(243,241,241);color:rgb(255,53,2);">-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)試選項(xiàng)

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

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

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

4 更多分享

架構(gòu)師李肯

一個專注于嵌入式IoT領(lǐng)域的架構(gòu)師。有著近10年的嵌入式一線開發(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ū)動移植開發(fā)、網(wǎng)絡(luò)通訊協(xié)議開發(fā)、編譯構(gòu)建原理及其實(shí)現(xiàn)、底層匯編及編譯原理、編譯優(yōu)化及代碼重構(gòu)、主流IoT云平臺的對接、嵌入式IoT系統(tǒng)的架構(gòu)設(shè)計等等。擁有多項(xiàng)IoT領(lǐng)域的發(fā)明專利,熱衷于技術(shù)分享,有多年撰寫技術(shù)博客的經(jīng)驗(yàn)積累,連續(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è)計師)等榮譽(yù)。堅信【知識改變命運(yùn),技術(shù)改變世界】!

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

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

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

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

    關(guān)注

    1

    文章

    366

    瀏覽量

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

    關(guān)注

    1

    文章

    392

    瀏覽量

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

    關(guān)注

    31

    文章

    1305

    瀏覽量

    40386
收藏 人收藏

    評論

    相關(guān)推薦

    RT-Thread上CAN實(shí)踐

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

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

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

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

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

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

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

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

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

    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 ?1500次閱讀
    2024 <b class='flag-5'>RT-Thread</b>全球巡回 線下培訓(xùn)火熱來襲!

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

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

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

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

    【上海】5月25日-基于恩智浦MCX N系列MCU結(jié)合RT-Thread的應(yīng)用與實(shí)踐 線下培訓(xùn)

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

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

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

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

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

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

    4月25日,下午我們將在北京舉辦RT-Thread混合部署線下workshop,在瑞芯微RK3568平臺上實(shí)現(xiàn)同時運(yùn)行RT-Thread和linux,本次workshop邀請到RT-Thread資深
    的頭像 發(fā)表于 04-16 08:35 ?462次閱讀
    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平臺上實(shí)現(xiàn)同時運(yùn)行RT-Thread和linux,本次workshop邀請到RT-Thread資深嵌入式軟件工程師農(nóng)曉明老師為您講
    的頭像 發(fā)表于 03-27 11:36 ?884次閱讀
    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平臺上實(shí)現(xiàn)同時運(yùn)行RT-Thread和linux,本次workshop邀請到RT-Thread資深
    的頭像 發(fā)表于 03-27 08:34 ?576次閱讀
    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 ?670次閱讀
    恩智浦半導(dǎo)體正式加入<b class='flag-5'>RT-Thread</b>全球合作伙伴計劃!
    线上百家乐怎么玩| 线上百家乐官网信誉| 赌场百家乐玩法介绍| 大发在线扑克| 永利高百家乐开户| 真钱网络棋牌游戏| 澳门百家乐真人娱乐城| 永利博线上娱乐城| 百家乐二代皇冠博彩| 新乡县| 澳门赌百家乐能赢钱吗| 百家乐官网网上投注网站| 杭州百家乐西园| 大发888手机版下载安装| 百家乐官网扑克牌手机壳| 澳门新世纪娱乐城| 百家乐庄闲和的概率| 百家乐官网赌场游戏平台| 516棋牌游戏| 百家乐的路单怎样看| 网上百家乐官网怎么破解| 正品百家乐网站| 免费百家乐官网游戏下| 喜達博彩网| 上海百家乐的玩法技巧和规则 | 百家乐大眼仔小路| 百家乐官网投注五揽式| 百家乐老是输| 百家乐官网赢钱公式1| 大发888提款之后多久到账| 百家乐小游戏开发| 真人百家乐官网代理合作| 大发888娱乐场下载安装| 诚信百家乐平台| 极速百家乐官网真人视讯| 优博平台| 旅百家乐赢钱律| 百家乐大老娱乐| 开心8百家乐官网游戏| 永利高a1娱乐城送彩金| 百家乐庄家提成|