文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Rust写的NuShell用起来真香

2024-12-03 09:45

关注

 数年来,shell作为我们和操作系统通讯的方式,本质上是一个命令解释器,它接收我们输入的命令(如ls,cat等),然后调用相应的应用程序。

如今你可能还在使用古老的bash和sh,或者看上去稍微不错的zsh,ksh,csh这些shell,还是在Windows下使用的PowerShell。今天我要给大家介绍一个生产力工具(装逼神器)Shell,它叫Nushell,关键是它用程序员最喜欢的Rust写的,速度飞快,作为内核的界面,用Rust重写Shell安全性提高了,bug率降低了。

NuShell从许多熟悉的领域中汲取了线索:bash 等传统 shell,PowerShell 等高级 shell,函数式编程,系统编程等。但是NuShell 并没有试图成为所有行业的杰作,而是将精力集中在做好一些事情上:

当你运行一个类似 ls 的命令时,第一个注意到的是所得到的不是一个文本块,而是一个结构化的表

  1. > ls *.md 
  2. ───┬────────────────────┬──────┬─────────┬──────────── 
  3.  # │ name               │ type │ size    │ modified  
  4. ───┼────────────────────┼──────┼─────────┼──────────── 
  5.  0 │ CODE_OF_CONDUCT.md │ File │  3.4 KB │ 5 days ago  
  6.  1 │ CONTRIBUTING.md    │ File │   886 B │ 5 days ago  
  7.  2 │ README.md          │ File │ 15.0 KB │ 5 days ago  
  8.  3 │ TODO.md            │ File │  1.6 KB │ 5 days ago  
  9. ───┴────────────────────┴──────┴─────────┴──────────── 

这个表不仅仅是用另一种方式显示了当前目录。就像电子表格中的表一样,可以更加交互性地处理数据。

比如,可以做的第一件事是把表格通过文件的大小来排序。

  1. > ls | sort-by size | reverse 
  2. ────┬────────────────────┬──────┬────────┬──────────── 
  3.  #  │ name               │ type │ size   │ modified 
  4. ────┼────────────────────┼──────┼────────┼──────────── 
  5.   0 │ Gemfile.lock       │ File │ 6.9 KB │ 3 days ago 
  6.   1 │ SUMMARY.md         │ File │ 3.7 KB │ 3 days ago 
  7.   2 │ Gemfile            │ File │ 1.1 KB │ 3 days ago 
  8.   3 │ LICENSE            │ File │ 1.1 KB │ 3 days ago 
  9.   4 │ CONTRIBUTING.md    │ File │  955 B │ 9 mins ago 
  10.   5 │ books.md           │ File │  687 B │ 3 days ago 
  11. ... 

可以看到我们没有给 ls 传递命令行参数。作为代替,使用了Nu提供的sort-by命令来排序ls的输出。为了让最大的文件位于顶部,还使用了reverse。

Nu提供了许多可在表格上工作的命令。例如,可以过滤ls表格,只显示大于1 KB的文件

  1. > ls | where size > 1kb 
  2. ───┬──────────────┬──────┬────────┬──────────── 
  3.  # │ name         │ type │ size   │ modified 
  4. ───┼──────────────┼──────┼────────┼──────────── 
  5.  0 │ Gemfile      │ File │ 1.1 KB │ 3 days ago 
  6.  1 │ Gemfile.lock │ File │ 6.9 KB │ 3 days ago 
  7.  2 │ LICENSE      │ File │ 1.1 KB │ 3 days ago 
  8.  3 │ SUMMARY.md   │ File │ 3.7 KB │ 3 days ago 
  9. ───┴──────────────┴──────┴────────┴──────────── 

就像 Unix 哲学,命令是可以互相组合起来,通过管道符链接.

接着看下一个命令ps

  1. > ps 
  2. ─────┬───────┬──────────────────┬─────────┬─────────┬──────────┬───────── 
  3.  #   │ pid   │ name             │ status  │ cpu     │ mem      │ virtual 
  4. ─────┼───────┼──────────────────┼─────────┼─────────┼──────────┼───────── 
  5.    0 │ 33155 │ nu_plugin_core_p │ Running │  3.8496 │   1.8 MB │  4.4 GB 
  6.    1 │ 32841 │ mdworker_shared  │ Running │  0.0000 │  19.3 MB │  4.4 GB 
  7.    2 │ 32829 │ CoreServicesUIAg │ Running │  0.0000 │  16.1 MB │  4.5 GB 
  8.    3 │ 32828 │ mdworker_shared  │ Running │  0.0000 │  23.0 MB │  4.4 GB 

如果你使用过Linux,可能会对ps命令相当熟悉。这个命令展示了系统所有正在运行的进程和它们的状态与名称。我们同样可以查看到它们的 CPU 占用。

如果想显示正在使用 CPU 的进程怎么办?就像之前使用ls命令一样,我们也可以使用ps命令返回的表:

  1. > ps | where cpu > 10 
  2. ───┬──────┬──────────────────┬─────────┬────────┬──────────┬───────── 
  3.  # │ pid  │ name             │ status  │ cpu    │ mem      │ virtual 
  4. ───┼──────┼──────────────────┼─────────┼────────┼──────────┼───────── 
  5.  0 │ 3971 │ Google Chrome He │ Running │ 5.1263 │  99.4 MB │  5.5 GB 
  6.  1 │  360 │ iTerm2           │ Running │ 6.6635 │ 218.6 MB │  6.0 GB 
  7. ───┴──────┴──────────────────┴─────────┴────────┴──────────┴───────── 

到目前为止,已经看到使用ls和ps列出文件和进程。Nu 还提供了其他可以创建有用信息表的命令。

接下来,让我们继续探索。

运行date将给出当前日期与时间的信息:

  1. date 
  2. ──────────┬──────── 
  3.  year     │ 2021 
  4.  month    │ 3 
  5.  day      │ 8 
  6.  hour     │ 09 
  7.  minute   │ 10 
  8.  second   │ 17 
  9.  timezone │ +08:00 
  10. ──────────┴──────── 

是不是比bash输出的要清晰好多,对比下bash的输出, 为了格式化,还需要查格式化命令

  1. Mon Mar  8 12:38:47 CST 2021 

运行sys将给出Nu所运行的系统的信息:

  1. > sys 
  2. ─────────┬───────────────────────────────────────── 
  3.  host    │ [row 7 columns] 
  4.  cpu     │ [row cores current ghz max ghz min ghz] 
  5.  disks   │ [table 2 rows
  6.  mem     │ [row free swap free swap total total] 
  7.  net     │ [table 11 rows
  8.  battery │ [table 1 rows
  9. ─────────┴───────────────────────────────────────── 

和之前的表有些不一样, sys命令给出的表在单元格内包含了另一些结构化的表格,也就是表格嵌套了,而非简单的数值。为了查看到这些数据,我们需要选择要看的列:

  1. > sys | get host 
  2. ──────────┬───────────────────────────────────────────── 
  3.  name     │ Linux 
  4.  release  │ 5.3.0-1019-azure 
  5.  version  │ #20-Ubuntu SMP Fri Mar 27 23:54:23 UTC 2020 
  6.  hostname │ lifeless 
  7.  arch     │ x86_64 
  8.  uptime   │ 8:03:47:32 
  9.  sessions │ [table 2 rows
  10. ──────────┴───────────────────────────────────────────── 

get命令可以跳入表格中一列的内容。这样,正在观看 host 列,它包含了关于 Nu 所运行的主机的信息、操作系统的名字、主机名、CPU、架构等等。让我们看看系统上的用户名:

  1. > sys | get host.sessions 
  2. ───┬───────── 
  3.  # │  
  4. ───┼───────── 
  5.  0 │ jonathan 
  6. ───┴───────── 

目前,系统上只有一个用户,名为 jonathan。你会注意到,我可以传递路径( host.sessions 部分),而不仅仅是传递列名。Nu 将采用该路径并转到表中的相应数据位置。

你可能已经注意到其他的不同之处。这次查询没有一个数据表,而是只有一个元素:字符串 jonathan。Nu使用数据表和字符串。字符串是在Nu之外使用命令的重要组成部分。

让我们看看字符串如何在Nu之外起作用。从前面的示例开始,并运行外部的 echo 命令( ^告诉nu不要使用内置的echo命令):

  1. > sys | get host.sessions | ^echo $it 
  2. jonathan 

如果这看起来与以前的传统Shell非常相似,那么就说明你拥有敏锐的眼睛!相似,但是有一个重要的区别:对前面看到的值调用了 ^echo 。这允许我们将数据从Nu传递到echo(或 Nu 外部的任何命令,例如 git)。

注意:Nu 的内建命令的帮助文本可以用 help 来浏览:

  1. > help config 
  2. Configuration management. 
  3.  
  4. Usage: 
  5.   > config  {flags} 
  6.  
  7. Subcommands: 
  8.   config get - Gets a value from the config 
  9.   config set - Sets a value in the config 
  10.   config set_into - Sets a value in the config 
  11.   config clear - clear the config 
  12.   config load - Loads the config from the path given 
  13.   config remove - Removes a value from the config 
  14.   config path - return the path to the config file 
  15.  
  16. Flags: 
  17.   -h, --help: Display this help message 

安装Nu

方式1:从 crates.io 安装

  1. cargo install nu 

方式2:使用 Homebrew,你需要安装 openssl 和 cmake:

  1. brew install openssl cmake 
  2.  
  3. brew install nushell 

安装完后,输入

  1. > nu 

进入Shell,即可尝试

本文转载自微信公众号「码小菜」,可以通过以下二维码关注。转载本文请联系码小菜公众号。

 

来源:码小菜内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯