数年来,shell作为我们和操作系统通讯的方式,本质上是一个命令解释器,它接收我们输入的命令(如ls,cat等),然后调用相应的应用程序。
如今你可能还在使用古老的bash和sh,或者看上去稍微不错的zsh,ksh,csh这些shell,还是在Windows下使用的PowerShell。今天我要给大家介绍一个生产力工具(装逼神器)Shell,它叫Nushell,关键是它用程序员最喜欢的Rust写的,速度飞快,作为内核的界面,用Rust重写Shell安全性提高了,bug率降低了。
NuShell从许多熟悉的领域中汲取了线索:bash 等传统 shell,PowerShell 等高级 shell,函数式编程,系统编程等。但是NuShell 并没有试图成为所有行业的杰作,而是将精力集中在做好一些事情上:
- 创建具有现代感的灵活的跨平台Shell
- 允许你将命令行应用程序与可理解数据结构的Shell进行混合和匹配
- 具有现代命令行应用程序提供的用户体验优化
- 用强大的管道控制你的操作系统
- 一切都是数据,并可以像sql一样查询数据
- 插件系统,你可以扩展Shell通过自己编写插件的方式
当你运行一个类似 ls 的命令时,第一个注意到的是所得到的不是一个文本块,而是一个结构化的表
> 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
───┴────────────────────┴──────┴─────────┴────────────
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
这个表不仅仅是用另一种方式显示了当前目录。就像电子表格中的表一样,可以更加交互性地处理数据。
比如,可以做的第一件事是把表格通过文件的大小来排序。
> 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
...
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
可以看到我们没有给 ls 传递命令行参数。作为代替,使用了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
───┴──────────────┴──────┴────────┴────────────
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
就像 Unix 哲学,命令是可以互相组合起来,通过管道符链接.
接着看下一个命令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
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
如果你使用过Linux,可能会对ps命令相当熟悉。这个命令展示了系统所有正在运行的进程和它们的状态与名称。我们同样可以查看到它们的 CPU 占用。
如果想显示正在使用 CPU 的进程怎么办?就像之前使用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
───┴──────┴──────────────────┴─────────┴────────┴──────────┴─────────
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
到目前为止,已经看到使用ls和ps列出文件和进程。Nu 还提供了其他可以创建有用信息表的命令。
接下来,让我们继续探索。
运行date将给出当前日期与时间的信息:
> date
──────────┬────────
year │ 2021
month │ 3
day │ 8
hour │ 09
minute │ 10
second │ 17
timezone │ +08:00
──────────┴────────
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
是不是比bash输出的要清晰好多,对比下bash的输出, 为了格式化,还需要查格式化命令
Mon Mar 8 12:38:47 CST 2021
- 1.
运行sys将给出Nu所运行的系统的信息:
> 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]
─────────┴─────────────────────────────────────────
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
和之前的表有些不一样, sys命令给出的表在单元格内包含了另一些结构化的表格,也就是表格嵌套了,而非简单的数值。为了查看到这些数据,我们需要选择要看的列:
> 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]
──────────┴─────────────────────────────────────────────
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
get命令可以跳入表格中一列的内容。这样,正在观看 host 列,它包含了关于 Nu 所运行的主机的信息、操作系统的名字、主机名、CPU、架构等等。让我们看看系统上的用户名:
> sys | get host.sessions
───┬─────────
# │ <value>
───┼─────────
0 │ jonathan
───┴─────────
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
目前,系统上只有一个用户,名为 jonathan。你会注意到,我可以传递路径( host.sessions 部分),而不仅仅是传递列名。Nu 将采用该路径并转到表中的相应数据位置。
你可能已经注意到其他的不同之处。这次查询没有一个数据表,而是只有一个元素:字符串 jonathan。Nu使用数据表和字符串。字符串是在Nu之外使用命令的重要组成部分。
让我们看看字符串如何在Nu之外起作用。从前面的示例开始,并运行外部的 echo 命令( ^告诉nu不要使用内置的echo命令):
> sys | get host.sessions | ^echo $it
jonathan
- 1.
- 2.
如果这看起来与以前的传统Shell非常相似,那么就说明你拥有敏锐的眼睛!相似,但是有一个重要的区别:对前面看到的值调用了 ^echo 。这允许我们将数据从Nu传递到echo(或 Nu 外部的任何命令,例如 git)。
注意:Nu 的内建命令的帮助文本可以用 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
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
安装Nu
方式1:从 crates.io 安装
cargo install nu
- 1.
方式2:使用 Homebrew,你需要安装 openssl 和 cmake:
brew install openssl cmake
brew install nushell
- 1.
- 2.
- 3.
安装完后,输入
> nu
- 1.
进入Shell,即可尝试
本文转载自微信公众号「码小菜」,可以通过以下二维码关注。转载本文请联系码小菜公众号。