致敬經典:在國產開源操作系統 RT-Thread 重溫 UNIX 彩色終端

引言


上篇文章里我們向大家介紹了 RT-Thread v5.1.0 的一些新特性。其中包括了終端環境的進一步完善。終端是人機交互的重要接口。實用的終端工具可以顯著地提升系統使用者的幸福指數。舉例來說,當我們想要修改一些系統配置,或是編寫腳本時,一個好用的文本編輯器總是不可或缺。以 UNIX 文本編輯器 Vim 為例子。得益于 v5.1.0 內核對于 POSIX 的支持,我們拉取源碼構建燒錄后,就可以在 RT-Thread Smart 上享受到原滋原味的 Vim 編程體驗啦。

ab8a3ff12ecdad9a5ea11998f072a1e5.png

在 smart 上編輯 ./rt-thread/tools/building.py

感覺如何?如果你不滿足于淺嘗輒止,請不要擔心。接下來的文章里我們將向你繼續分享 RT-Thread Smart 中的終端環境組成和使用。

Busybox


被業內稱之為瑞士軍刀的BusyBox,嵌入式Linuxer對它肯定不會感到陌生,甚至熟悉到忽略他無時無刻的存在。它在單一的可執行文件中提供了精簡的Unix工具集,可運行于多款POSIX環境的操作系統。

RT-Thread Smart 已適配了上百種 Busybox 命令。而 Busybox 也是 Smart 當前的終端環境的一個重要組成部分。其中包括 init 提供的初始化和系統管理,ash提供的命令解釋、腳本執行、作業控制等。接下來我們結合實際例子深入探索這些部分的實際應用和能力。

8199b72c738d53a3fcdb6dbcd91ff6ba.png

Smart 已適配的 Busybox 命令集

init進程介紹


init(為英語:initialization的簡寫)是 Unix 和 類Unix 系統中用來產生其它所有進程的程序。它以守護進程的方式存在,其進程號為1。系統在引導時加載內核后,便由內核加載init程序,由init程序完成余下的引導過程,比如加載執行級別,加載服務,啟動Shell/圖形化界面等等。

init進程運行之后會加載解析/etc/inittab文件的內容,根據腳本項目決定接下來的運行模式和需要啟動的命令。以下是本次體驗中使用的 inittab 腳本。

1#?Copyright?(c)?2006-2024,?RT-Thread?Development?Team2#3#?SPDX-License-Identifier:?Apache-2.045#?Mount?Filesystem6::sysinit:mkdir?-p?/dev/shm?/dev/pts?/proc7::sysinit:mount?-a89#?Run?getty?&?login
10console::respawn:/sbin/getty?115200?/dev/console
11
12#?Restart?bussiness
13::restart:/sbin/init

根據這個腳本,init 進程會首先創建掛載點,然后通過 mount 命令掛載文件系統。等到上序進程都退出后,啟動 getty 獲得 console TTY 設備作為會話控制終端。getty 接著會啟動 login。它在 TTY 設備上等待用戶登錄,并在用戶名、密碼校驗成功后啟動 shell 程序,也就是 busybox ash 。

ash介紹

Almquist shell,經常被簡稱為 A Shell 或 ash,一種Unix shell,源自于Bourne shell,由肯尼斯·艾昆斯特(Kenneth Almquist)在SVR4上建立了這個分支。它的特色是快而且輕巧,兼容于POSIX,在后來的BSD版本上,它取代了Bourne shell。在BusyBox中,實現了類似于ash標準的shell的程序。

結合上文介紹的初始化過程配置,在系統登錄完成后,就會看到 ash 打印的命令提示符。此時一個 ash 進程就運行在 RT-Thread Smart 內核中實現用戶交互,命令解析。

系統登錄并執行 top 命令效果

既然來到shell中,那就不得不忽略其強大的腳本執行功能。shell 腳本的兼容度對于批處理、自動化測試來說非常重要。我們通過一個流行的 shell 腳本單元測試工具 shUnit2 展示這個功能。

https://github.com/kward/shunit2

shUnit2 本質是一套 shell 腳本庫,包含了眾多預定義函數。我們利用它,可以用簡單的腳本實現復雜的單元測試過程。將克隆下來的倉庫放入根文件系統的 /root 文件夾之后,可以在 ./shunit2/example 下看到一些樣例代碼。這里給出一個測試 suite 腳本。

1#!/bin/sh2#?本腳本就是倉庫對應路徑 ./example/suite_test.sh 文件的內容。3#?這是一個測試套件樣例,允許開發者將測試函數注冊到?shUnit2?框架中,4#?使其成為測試執行的一部分。對應的,沒有注冊的函數不會在 report 中體現5suite()?{6??suite_addTest?suite_test_one78??suite_test_two9}
10
11suite_test_one()?{
12??assertEquals?1?1
13}
14
15suite_test_two()?{
16??assertNotEquals?1?2
17}
18
19#?Load?and?run?shUnit2.
20.?../shunit2

在 ash 中執行這個文件,我們就成功在 RT-Smart 中運行了一個基于命令解釋器實現的單元測試 suite。

24fd27665060fea26736febd7cc03750.png

執行測試套件 suite_test.sh

作業控制(Job Control)介紹


在解釋作業控制前,我們先要簡單介紹一下它的概念。對于當前操作者來說,能夠操作的命令控制臺終端shell是一個獨立的shell,并根據是否可以直接操作當前shell的程序來將shell中的作業分為前臺與后臺兩種狀態。能夠直接在shell上交互的程序稱為前臺狀態,而不能直接交互的程序為后臺狀態。如果把所有的前后臺程序都統一稱作作業(job),那么可以基于當前的shell對所有的job來進行作業控制,從而稱作job control。

如上所述job control就是基于當前的shell前后臺作業來實現作業管理的,典型的管理有:將一個前臺程序ctrl+c終止掉,或將一個新的作業啟動放入后臺(&后綴啟動),或將一個后臺程序放入前臺(fg命令)。其它的操作例如還有:jobs命令查看所有后臺作業狀態,ctrl+z暫停一個前臺作業并放入后臺,bg將一個后臺作業轉入后臺運行等等。常用的操作命令集如:

●?jobs命令

●?fg 命令

●?bg 命令

●?ctrl+c/ctrl+z/ctrl+d/ctrl+\

●?& 啟動后臺作業

那么作業控制有什么具體的應用呢?假設一個日常生活中的常見場景,首先我們使用 Vim 創建一個文件開始編輯。編輯過程中,可能突然需要做別的事情。此時就可以像 GUI 中的“最小化”操作一樣,通過 Ctrl^z 掛起 Vim 并回到 ash。通過 jobs 命令我們可以看到 Vim 掛起后更新為作業 %1 并處于停止狀態(Stopped)。

Vim 掛起效果

當我們想要繼續編輯時,就可以在 ash 中使用 fg 命令指定 Vim,將其恢復到前臺運行。這類似 GUI 中的“最大化”操作。當我們在 Vim 完成文檔編輯操作并退出后,可以通過 jobs 命令看到作業已經清空。通過 cat 命令我們看到文件已經成功保存。

后臺作業換入前臺效果

總結


基于 Busybox ,我們介紹了 RT-Smart 終端環境的使用體驗,看到了“瑞士軍刀” BusyBox 強大的功能。通過實際的啟動腳本示例,展示了 init 進程如何加載和初始化系統,通過 shUnit2 展示了 ash 提供的強大腳本執行能力,并借助 Vim 展示了job control 的前后臺控制特性。

不知道大家是否對 RT-Smart 的能力有了進一步了解。如果您對 RT-Thread Smart 的應用和功能感興趣,可以在RT-Thread 官方發布的 ART-Pi Smart 開發板上了解、學習和開發 RT-Thread Smart 系統與應用。這是首個運行 RT-Thread Smart 的 ARM Cortex-A7 開發板,具有強大的硬件性能和豐富的外設接口。

22808494199ae75bbdf8ff7dff1a50d1.png

ART-Pi Smart 硬件規格情況

探索新升級!在 ART-Pi Smart 體驗 RT-Thread Smart v5.1.0

可以參考以上推文,了解 ART-Pi Smart 的 busybox 與應用開發體驗及開發板獲取方式。此外我們也發布了prebuilt(https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-smart/introduction/rt-smart-experiences/rt-smart-experiences)版本鏡像供您在 QEMU 上立即體驗到包括 Weston、dropbear、vim、tmux 在內的各種工具和組件。

歡迎大家在 RT-Thread Github 倉庫或論壇上向我們反饋意見和建議。另外,如果您對參與到 RT-Thread 的平臺支持(risc-v、arm、arm64 平臺上的驅動、內核代碼完善)、應用移植與開發、文檔維護感興趣,我們誠邀您加入 Smart 興趣小組,參與到與 Smart 相關的開源貢獻中。

5b73073fc3214ea018e05d418d479ec6.png

https://jinshuju.net/f/qY5kTs

(偷偷告訴你:近期內貢獻獎勵將會到賬,機不可失時不再來哦)

最后是次回預告。我們計劃在下一篇文章為大家分享 tmux 與 dropbear(sshd) 工具的使用體驗。如果您感興趣還請持續關注。

——————End——————

b451d54db8ad58d4bc8a7aa9733f3e39.jpeg

f41fa6540353a1180a7c94f9434eeb64.gif

👇?點擊閱讀原文進入官網

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/37347.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/37347.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/37347.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux——echo命令,管道符,vi/vim 文本編輯器

1.echo 命令 作用 向終端設備上輸出字符串或變量的存儲數據 格式 echo " 字符串 " echo $ 變 量名 [rootserver ~] # echo $SHELL # 輸出變量的值必須加 $ /bin/bash [rootserver ~] # str1" 我愛中國 " # 自定義變量 echo 重定向輸出到文件 ec…

MySQL數據庫——在Centos7環境安裝

MySQL在Centos7環境安裝 1.切換root用戶 安裝與卸載中,用戶全部切換成為root,安裝好后,普通用戶也能使用 2.卸載不要的環境 要將自己環境中有關mysql的全都刪除,避免安裝過程中被影響 ps axj | grep mariadb 先檢查是否有mari…

近似最近鄰查找的幾種方法

近似最近鄰查找 定義主要方法1. 局部敏感哈希(LSH)2. KD樹(k-d tree)3. 球樹(Ball Tree)4. 隨機投影樹(Random Projection Trees)5. 圖結構方法(Graph-Based Methods&…

自制全網最便宜的雷達感應燈光畫,成本只需5元

自制全網最便宜的雷達感應燈光畫,成本5元 ? 成本組成:帶熱釋電的人體感應燈(0.5元)雷達感應模塊(3.5元)首飾盒(0.45元)微噴油畫布(1元)5.45元 ? 說一下做燈…

Flutter學習:從搭建環境到運行

一、開發環境的搭建 本文所示內容都是在Windows系統下進行的。 1、下載 Flutter SDK Flutter 官網(https://docs.flutter.cn/release/archive?tabwindows) 或者通過 git clone -b master https://github.com/flutter/flutter.git 下載 2、配置環境…

[數據集][目標檢測]井蓋未蓋好檢測數據集VOC+YOLO格式20123張2類別

數據集格式:Pascal VOC格式YOLO格式(不包含分割路徑的txt文件,僅僅包含jpg圖片以及對應的VOC格式xml文件和yolo格式txt文件) 圖片數量(jpg文件個數):20123 標注數量(xml文件個數):20123 標注數量(txt文件個數):20123 標…

Gamepad API 控制游戲的 JavaScript 指南

在現代網頁游戲中,通過游戲手柄來控制游戲是一種常見的需求。HTML5 提供了一個名為 Gamepad API 的接口,使得從瀏覽器中讀取游戲手柄輸入變得相對簡單。 什么是 Gamepad API? Gamepad API 是 HTML5 的一部分,允許開發者通過 Jav…

.net 奇葩問題調試經歷之2——內存暴漲,來自非托管的內存泄露

??歡迎點贊 :?? 收藏 ?留言 ?? 如有錯誤敬請指正,賜人玫瑰,手留余香!??本文作者:由webmote 原創??作者格言:新的征程,我們面對的不僅僅是技術還有人心,人心不可測,海水不可量,唯有技術,才是深沉黑夜中的一座閃爍的燈塔序言 這是一個序列文章,請看以往文…

AI推介-信息抽取(information extraction,NER)論文速覽(arXiv方向):2023.11.15-2023.12.31

文章目錄~ 1.Large Language Models for Generative Information Extraction: A Survey2.Commonsense for Zero-Shot Natural Language Video Localization3.Unified Lattice Graph Fusion for Chinese Named Entity Recognition4.Solving Label Variation in Scien…

代碼統計工具V1.0.0(支持各種文件類型)

點擊下載《代碼統計工具(支持各種文件類型)》 1. 前言 本文介紹了一款使用C#開發的代碼行數統計軟件。該軟件允許用戶通過選擇文件目錄和設置統計項目類型,來統計指定目錄下的代碼行數。軟件提供了三種統計方式:按文件名統計、按…

線性圖標繪制指南:從基礎到精通

圖標在生活中隨處可見。相比文字來說,圖標可以讓人在更短的時間內認知并了解信息,并且大大提升信息的視覺美觀性,增加設計的藝術感染力。在用戶界面中使用圖標,是一種用戶熟知的設計模式。而線性圖標是通過提煉圖形輪廓&#xff0…

jquery動態插件之gsap和TextPlugin

<!DOCTYPE html> <html> <head><title>數字化人才認證數動畫</title><script src"https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script><script src"https://cdnjs.cloudflare.com/ajax…

【強化學習】第02期:動態規劃方法

筆者近期上了國科大周曉飛老師《強化學習及其應用》課程&#xff0c;計劃整理一個強化學習系列筆記。筆記中所引用的內容部分出自周老師的課程PPT。筆記中如有不到之處&#xff0c;敬請批評指正。 文章目錄 2.1 動態規劃&#xff1a;策略收斂法/策略迭代法2.2 動態規劃&#xf…

GD32F4時鐘配置

1.前言 硬件&#xff1a;GD32F450 最高時鐘頻率200MHZ(外部晶振8MHZ) 軟件&#xff1a;KEIL(V5.35) 固件包&#xff1a;GD32F4xx_Firmware_Library_V3.2.0 2.時鐘樹 時鐘配置大概流程如下圖紅線指示&#xff0c;GD32F470的最高頻率可以到240MHZ&#xff0c;GD32F450最高…

【frp】cron定時檢查zfrpc.service是否啟動成功

zfrpc 經常自動啟動失敗cron定時檢查zfrpc.service是否啟動成功 ChatGPT 要使用 cron 定期檢查 zfrpc.service 是否啟動成功,并在服務未運行時嘗試啟動它,你可以按照以下步驟進行操作: 創建腳本 首先,你需要創建一個腳本,這個腳本將檢查 zfrpc.service 的狀態,并在服務未…

字符串反轉字符串單詞(1)

大家好&#xff0c;今天我們來探討一道經典的編程問題——翻轉字符串里的單詞。這個問題要求我們編寫一個函數&#xff0c;將輸入字符串中的所有單詞進行翻轉&#xff0c;但單詞內部的字符順序保持不變。 問題分析&#xff1a; 1. 首先&#xff0c;我們需要理解翻轉字符串里的…

Codeforces Round 143 (Div. 2) C. To Add or Not to Add 題解 前綴和 二分

To Add or Not to Add 題目描述 A piece of paper contains an array of n n n integers a 1 , a 2 , . . . , a n a_{1},a_{2},...,a_{n} a1?,a2?,...,an?. Your task is to find a number that occurs the maximum number of times in this array. However, before l…

點云壓縮配置開發環境遇到一些bug

1、配置基于cuda的計算庫&#xff0c;Chamfer3D和pointops 編譯chamfer3D時候會遇到一個cub版本的校驗錯誤。 解決方法&#xff1a;根據錯誤提示&#xff0c;進入cuda的config配置文件中&#xff0c;使用#define將校驗功能關閉 編譯pointops&#xff0c;會遇到報錯&#xff1a;…

C++Primer Plus 第十四章代碼重用:14.4.4 數組模板示例和非類型參數2

14.4.4 數組模板示例和非類型參數 提示&#xff1a;這里可以添加系列文章的所有文章的目錄&#xff0c;目錄需要自己手動添加 例如&#xff1a;第一章 Python 機器學習入門之pandas的使用 提示&#xff1a;寫完文章后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右…

《分析模式》漫談08-單繼承不是“唯一繼承”

DDD領域驅動設計批評文集 做強化自測題獲得“軟件方法建模師”稱號 《軟件方法》各章合集 《分析模式》第2章這一段&#xff1a; 劃線處的single inheritance&#xff0c;2004中譯本的翻譯&#xff1a; 翻譯為“單繼承”&#xff0c;是正確的。 2020中譯本的翻譯&#xff1a…