Rust寫的NuShell用起來真香
數(shù)年來,shell作為我們和操作系統(tǒng)通訊的方式,本質(zhì)上是一個命令解釋器,它接收我們輸入的命令(如ls,cat等),然后調(diào)用相應(yīng)的應(yīng)用程序。
如今你可能還在使用古老的bash和sh,或者看上去稍微不錯的zsh,ksh,csh這些shell,還是在Windows下使用的PowerShell。今天我要給大家介紹一個生產(chǎn)力工具(裝逼神器)Shell,它叫Nushell,關(guān)鍵是它用程序員最喜歡的Rust寫的,速度飛快,作為內(nèi)核的界面,用Rust重寫Shell安全性提高了,bug率降低了。
NuShell從許多熟悉的領(lǐng)域中汲取了線索:bash 等傳統(tǒng) shell,PowerShell 等高級 shell,函數(shù)式編程,系統(tǒng)編程等。但是NuShell 并沒有試圖成為所有行業(yè)的杰作,而是將精力集中在做好一些事情上:
- 創(chuàng)建具有現(xiàn)代感的靈活的跨平臺Shell
- 允許你將命令行應(yīng)用程序與可理解數(shù)據(jù)結(jié)構(gòu)的Shell進(jìn)行混合和匹配
- 具有現(xiàn)代命令行應(yīng)用程序提供的用戶體驗優(yōu)化
- 用強(qiáng)大的管道控制你的操作系統(tǒng)
- 一切都是數(shù)據(jù),并可以像sql一樣查詢數(shù)據(jù)
- 插件系統(tǒng),你可以擴(kuò)展Shell通過自己編寫插件的方式
當(dāng)你運行一個類似 ls 的命令時,第一個注意到的是所得到的不是一個文本塊,而是一個結(jié)構(gòu)化的表
- > ls *.md
- ───┬────────────────────┬──────┬─────────┬────────────
- # │ name │ type │ size │ modified
- ───┼────────────────────┼──────┼─────────┼────────────
- 0 │ CODE_OF_CONDUCT.md │ File │ 3.4 KB │ 5 days ago
- 1 │ CONTRIBUTING.md │ File │ 886 B │ 5 days ago
- 2 │ README.md │ File │ 15.0 KB │ 5 days ago
- 3 │ TODO.md │ File │ 1.6 KB │ 5 days ago
- ───┴────────────────────┴──────┴─────────┴────────────
這個表不僅僅是用另一種方式顯示了當(dāng)前目錄。就像電子表格中的表一樣,可以更加交互性地處理數(shù)據(jù)。
比如,可以做的第一件事是把表格通過文件的大小來排序。
- > ls | sort-by size | reverse
- ────┬────────────────────┬──────┬────────┬────────────
- # │ name │ type │ size │ modified
- ────┼────────────────────┼──────┼────────┼────────────
- 0 │ Gemfile.lock │ File │ 6.9 KB │ 3 days ago
- 1 │ SUMMARY.md │ File │ 3.7 KB │ 3 days ago
- 2 │ Gemfile │ File │ 1.1 KB │ 3 days ago
- 3 │ LICENSE │ File │ 1.1 KB │ 3 days ago
- 4 │ CONTRIBUTING.md │ File │ 955 B │ 9 mins ago
- 5 │ books.md │ File │ 687 B │ 3 days ago
- ...
可以看到我們沒有給 ls 傳遞命令行參數(shù)。作為代替,使用了Nu提供的sort-by命令來排序ls的輸出。為了讓最大的文件位于頂部,還使用了reverse。
Nu提供了許多可在表格上工作的命令。例如,可以過濾ls表格,只顯示大于1 KB的文件
- > ls | where size > 1kb
- ───┬──────────────┬──────┬────────┬────────────
- # │ name │ type │ size │ modified
- ───┼──────────────┼──────┼────────┼────────────
- 0 │ Gemfile │ File │ 1.1 KB │ 3 days ago
- 1 │ Gemfile.lock │ File │ 6.9 KB │ 3 days ago
- 2 │ LICENSE │ File │ 1.1 KB │ 3 days ago
- 3 │ SUMMARY.md │ File │ 3.7 KB │ 3 days ago
- ───┴──────────────┴──────┴────────┴────────────
就像 Unix 哲學(xué),命令是可以互相組合起來,通過管道符鏈接.
接著看下一個命令ps
- > ps
- ─────┬───────┬──────────────────┬─────────┬─────────┬──────────┬─────────
- # │ pid │ name │ status │ cpu │ mem │ virtual
- ─────┼───────┼──────────────────┼─────────┼─────────┼──────────┼─────────
- 0 │ 33155 │ nu_plugin_core_p │ Running │ 3.8496 │ 1.8 MB │ 4.4 GB
- 1 │ 32841 │ mdworker_shared │ Running │ 0.0000 │ 19.3 MB │ 4.4 GB
- 2 │ 32829 │ CoreServicesUIAg │ Running │ 0.0000 │ 16.1 MB │ 4.5 GB
- 3 │ 32828 │ mdworker_shared │ Running │ 0.0000 │ 23.0 MB │ 4.4 GB
如果你使用過Linux,可能會對ps命令相當(dāng)熟悉。這個命令展示了系統(tǒng)所有正在運行的進(jìn)程和它們的狀態(tài)與名稱。我們同樣可以查看到它們的 CPU 占用。
如果想顯示正在使用 CPU 的進(jìn)程怎么辦?就像之前使用ls命令一樣,我們也可以使用ps命令返回的表:
- > ps | where cpu > 10
- ───┬──────┬──────────────────┬─────────┬────────┬──────────┬─────────
- # │ pid │ name │ status │ cpu │ mem │ virtual
- ───┼──────┼──────────────────┼─────────┼────────┼──────────┼─────────
- 0 │ 3971 │ Google Chrome He │ Running │ 5.1263 │ 99.4 MB │ 5.5 GB
- 1 │ 360 │ iTerm2 │ Running │ 6.6635 │ 218.6 MB │ 6.0 GB
- ───┴──────┴──────────────────┴─────────┴────────┴──────────┴─────────
到目前為止,已經(jīng)看到使用ls和ps列出文件和進(jìn)程。Nu 還提供了其他可以創(chuàng)建有用信息表的命令。
接下來,讓我們繼續(xù)探索。
運行date將給出當(dāng)前日期與時間的信息:
- > date
- ──────────┬────────
- year │ 2021
- month │ 3
- day │ 8
- hour │ 09
- minute │ 10
- second │ 17
- timezone │ +08:00
- ──────────┴────────
是不是比bash輸出的要清晰好多,對比下bash的輸出, 為了格式化,還需要查格式化命令
- Mon Mar 8 12:38:47 CST 2021
運行sys將給出Nu所運行的系統(tǒng)的信息:
- > sys
- ─────────┬─────────────────────────────────────────
- host │ [row 7 columns]
- cpu │ [row cores current ghz max ghz min ghz]
- disks │ [table 2 rows]
- mem │ [row free swap free swap total total]
- net │ [table 11 rows]
- battery │ [table 1 rows]
- ─────────┴─────────────────────────────────────────
和之前的表有些不一樣, sys命令給出的表在單元格內(nèi)包含了另一些結(jié)構(gòu)化的表格,也就是表格嵌套了,而非簡單的數(shù)值。為了查看到這些數(shù)據(jù),我們需要選擇要看的列:
- > sys | get host
- ──────────┬─────────────────────────────────────────────
- name │ Linux
- release │ 5.3.0-1019-azure
- version │ #20-Ubuntu SMP Fri Mar 27 23:54:23 UTC 2020
- hostname │ lifeless
- arch │ x86_64
- uptime │ 8:03:47:32
- sessions │ [table 2 rows]
- ──────────┴─────────────────────────────────────────────
get命令可以跳入表格中一列的內(nèi)容。這樣,正在觀看 host 列,它包含了關(guān)于 Nu 所運行的主機(jī)的信息、操作系統(tǒng)的名字、主機(jī)名、CPU、架構(gòu)等等。讓我們看看系統(tǒng)上的用戶名:
- > sys | get host.sessions
- ───┬─────────
- # │ <value>
- ───┼─────────
- 0 │ jonathan
- ───┴─────────
目前,系統(tǒng)上只有一個用戶,名為 jonathan。你會注意到,我可以傳遞路徑( host.sessions 部分),而不僅僅是傳遞列名。Nu 將采用該路徑并轉(zhuǎn)到表中的相應(yīng)數(shù)據(jù)位置。
你可能已經(jīng)注意到其他的不同之處。這次查詢沒有一個數(shù)據(jù)表,而是只有一個元素:字符串 jonathan。Nu使用數(shù)據(jù)表和字符串。字符串是在Nu之外使用命令的重要組成部分。
讓我們看看字符串如何在Nu之外起作用。從前面的示例開始,并運行外部的 echo 命令( ^告訴nu不要使用內(nèi)置的echo命令):
- > sys | get host.sessions | ^echo $it
- jonathan
如果這看起來與以前的傳統(tǒng)Shell非常相似,那么就說明你擁有敏銳的眼睛!相似,但是有一個重要的區(qū)別:對前面看到的值調(diào)用了 ^echo 。這允許我們將數(shù)據(jù)從Nu傳遞到echo(或 Nu 外部的任何命令,例如 git)。
注意:Nu 的內(nèi)建命令的幫助文本可以用 help 來瀏覽:
- > help config
- Configuration management.
- Usage:
- > config <subcommand> {flags}
- Subcommands:
- config get - Gets a value from the config
- config set - Sets a value in the config
- config set_into - Sets a value in the config
- config clear - clear the config
- config load - Loads the config from the path given
- config remove - Removes a value from the config
- config path - return the path to the config file
- Flags:
- -h, --help: Display this help message
安裝Nu
方式1:從 crates.io 安裝
- cargo install nu
方式2:使用 Homebrew,你需要安裝 openssl 和 cmake:
- brew install openssl cmake
- brew install nushell
安裝完后,輸入
- > nu
進(jìn)入Shell,即可嘗試
本文轉(zhuǎn)載自微信公眾號「碼小菜」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系碼小菜公眾號。