nushell 一种新的Shell 利用管道控制任意系统

nushell简介

Nushell(也称为“nu”)是一种现代的、可编程的、基于文本的Shell,旨在提供更好的用户体验和更强大的命令行工具。它支持管道和重定向等传统Shell功能,并且可以通过Rust编写脚本和插件。

Nushell是一种Shell,它提供了一个交互式的命令行界面和一组命令,可以与计算机进行交互。与其他传统Shell不同,Nushell使用了一种基于表格的数据模型来处理和操作数据,这使得它在处理文本、文件和结构化数据方面更加强大和灵活

Nushell还提供了一些现代化的功能,如语法高亮、自动补全、历史记录搜索等,这些功能使得用户在使用命令行时更加便捷和高效。此外,Nushell还具有可编程性,用户可以使用Rust编写脚本和插件来扩展其功能。

nushell 一种新的Shell 利用管道控制任意系统

介绍

你好,欢迎来到 Nushell 项目。这个项目的目标是继承 Unix Shell 中用管道把简单的命令连接在一起的理念,并将其带到更具现代风格的开发中。

Nu 汲取了很多常见领域的灵感:传统 Shell 比如 Bash、基于对象的 Shell 比如 PowerShell、逐步类型化的语言比如 TypeScript、函数式编程、系统编程,等等。但是,Nu 并不试图成为万金油,而是把精力集中在做好这几件事上:

  • 作为一个具有现代感的灵活的跨平台 Shell;
  • 作为一种现代的编程语言,解决与数据有关的问题;
  • 给予清晰的错误信息和干净的 IDE 支持;

了解 Nu 能做什么的最简单的方法是从一些例子开始,所以让我们深入了解一下。

当你运行ls这样的命令时,你会注意到的第一件事是,你得到的不是一个文本块,而是一个结构化的表格:

> ls
╭────┬───────────────────────┬──────┬───────────┬─────────────╮
│ #  │         name          │ type │   size    │  modified   │
├────┼───────────────────────┼──────┼───────────┼─────────────┤
│  0 │ 404.html              │ file │     429 B │ 3 days ago  │
│  1 │ CONTRIBUTING.md       │ file │     955 B │ 8 mins ago  │
│  2 │ Gemfile               │ file │   1.1 KiB │ 3 days ago  │
│  3 │ Gemfile.lock          │ file │   6.9 KiB │ 3 days ago  │
│  4 │ LICENSE               │ file │   1.1 KiB │ 3 days ago  │
│  5 │ README.md             │ file │     213 B │ 3 days ago  │
...

该表不仅仅是以不同的方式显示目录,就像电子表格中的表一样,它还允许我们以更加互动的方式来处理数据。

我们要做的第一件事是按大小对我们的表进行排序。要做到这一点,我们将从ls中获取输出,并将其输入到一个可以根据列的内容对表进行排序的命令中:

> ls | sort-by size | reverse
╭────┬───────────────────────┬──────┬───────────┬─────────────╮
│ #  │         name          │ type │   size    │  modified   │
├────┼───────────────────────┼──────┼───────────┼─────────────┤
│  0 │ Gemfile.lock          │ file │   6.9 KiB │ 3 days ago  │
│  1 │ SUMMARY.md            │ file │   3.7 KiB │ 3 days ago  │
│  2 │ Gemfile               │ file │   1.1 KiB │ 3 days ago  │
│  3 │ LICENSE               │ file │   1.1 KiB │ 3 days ago  │
│  4 │ CONTRIBUTING.md       │ file │     955 B │ 9 mins ago  │
│  5 │ books.md              │ file │     687 B │ 3 days ago  │
...

你可以看到,为了达到这个目的,我们没有向ls传递命令行参数。取而代之的是,我们使用了 Nu 提供的sort-by命令来对ls命令的输出进行排序。为了在顶部看到最大的文件,我们还使用了reverse命令。

Nu 提供了许多可以对表进行操作的命令,例如,我们可以过滤ls表的内容,使其只显示超过 1 千字节的文件。

> ls | where size > 1kb
╭───┬───────────────────┬──────┬─────────┬────────────╮
│ # │       name        │ type │  size   │  modified  │
├───┼───────────────────┼──────┼─────────┼────────────┤
│ 0 │ Gemfile           │ file │ 1.1 KiB │ 3 days ago │
│ 1 │ Gemfile.lock      │ file │ 6.9 KiB │ 3 days ago │
│ 2 │ LICENSE           │ file │ 1.1 KiB │ 3 days ago │
│ 3 │ SUMMARY.md        │ file │ 3.7 KiB │ 3 days ago │
╰───┴───────────────────┴──────┴─────────┴────────────╯

就像在 Unix 哲学中一样,能够让命令相互对话给我们提供了在许多不同的组合中对命令进行混搭的方法。我们来看看一个不同的命令:

> ps
╭─────┬───────┬───────┬──────────────────────────────────────────────┬─────────┬───────┬──────────┬──────────╮
│   # │  pid  │ ppid  │                     name                     │ status  │  cpu  │   mem    │ virtual  │
├─────┼───────┼───────┼──────────────────────────────────────────────┼─────────┼───────┼──────────┼──────────┤
│   0 │ 87194 │     1 │ mdworker_shared                              │ Sleep   │  0.00 │  25.9 MB │ 418.0 GB │
│   1 │ 87183 │  2314 │ Arc Helper (Renderer)                        │ Sleep   │  0.00 │  59.9 MB │   1.6 TB │
│   2 │ 87182 │  2314 │ Arc Helper (Renderer)                        │ Sleep   │  0.23 │ 224.3 MB │   1.6 TB │
│   3 │ 87156 │ 87105 │ Code Helper (Plugin)                         │ Sleep   │  0.00 │  56.0 MB │ 457.4 GB │
...

如果你使用过 Linux,你可能对ps命令很熟悉。通过它,我们可以得到一个当前系统正在运行的所有进程的列表,它们的状态是什么,以及它们的名字是什么,我们还可以看到这些进程的 CPU 负载。

如果我们想显示那些正在活跃使用 CPU 的进程呢?就像我们之前对ls命令所做的那样,我们也可以利用ps命令返回给我们的表格来做到:

> ps | where cpu > 5
╭───┬───────┬───────┬─────────────────────────────────────────┬─────────┬───────┬──────────┬──────────╮
│ # │  pid  │ ppid  │                  name                   │ status  │  cpu  │   mem    │ virtual  │
├───┼───────┼───────┼─────────────────────────────────────────┼─────────┼───────┼──────────┼──────────┤
│ 0 │ 86759 │ 86275 │ nu                                      │ Running │  6.27 │  38.7 MB │ 419.7 GB │
│ 1 │ 89134 │     1 │ com.apple.Virtualization.VirtualMachine │ Running │ 23.92 │   1.5 GB │ 427.3 GB │
│ 2 │ 70414 │     1 │ VTDecoderXPCService                     │ Sleep   │ 19.04 │  17.5 MB │ 419.7 GB │
│ 3 │  2334 │     1 │ TrackpadExtension                       │ Sleep   │  7.47 │  25.3 MB │ 418.8 GB │
│ 4 │  1205 │     1 │ iTerm2                                  │ Sleep   │ 11.92 │ 657.2 MB │ 421.7 GB │
╰───┴───────┴───────┴─────────────────────────────────────────┴─────────┴───────┴──────────┴──────────╯

到目前为止,我们一直在使用lsps来列出文件和进程。Nu 还提供了其他可以创建有用信息表格的命令。接下来,让我们试一下datesys

运行date now输出关于当前日期和时间的信息:

> date now
2022-03-07 14:14:51.684619600 -08:00

为了将获得的日期以表格形式展示,我们可以把它输入到 date to-table中:

> date now | date to-table
╭───┬──────┬───────┬─────┬──────┬────────┬────────┬──────────╮
│ # │ year │ month │ day │ hour │ minute │ second │ timezone │
├───┼──────┼───────┼─────┼──────┼────────┼────────┼──────────┤
│ 0 │ 2022 │     3 │   7 │   14 │     45 │      3 │ -08:00   │
╰───┴──────┴───────┴─────┴──────┴────────┴────────┴──────────╯

运行sys可以得到 Nu 所运行的系统的信息:

> sys | table
╭───────┬───────────────────╮
│ host  │ {record 6 fields} │
│ cpu   │ [table 4 rows]    │
│ disks │ [table 3 rows]    │
│ mem   │ {record 4 fields} │
│ temp  │ [table 1 row]     │
│ net   │ [table 4 rows]    │
╰───────┴───────────────────╯

这与我们之前看到的表格有些不同。sys命令输出了一个在单元格中包含结构化表格而非简单值的表格。要查看这些数据,我们需要 get 待查看的列:

> sys | get host
╭────────────────┬────────────────────────╮
│ name           │ Debian GNU/Linux       │
│ os version     │ 11                     │
│ kernel version │ 5.10.92-v8+            │
│ hostname       │ lifeless               │
│ uptime         │ 19day 21hr 34min 45sec │
│ sessions       │ [table 1 row]          │
╰────────────────┴────────────────────────╯

get命令让我们深入表的某一列内容中。在这里,我们要查看的是 “host” 列,它包含了 Nu 正在运行的主机的信息:操作系统名称、主机名、CPU,以及更多。让我们来获取系统上的用户名:

> sys | get host.sessions.name
╭───┬────╮
│ 0 │ jt │
╰───┴────╯

现在,系统中只有一个名为 “jt” 的用户。你会注意到,我们可以传递一个列路径(host.sessions.name部分),而不仅仅是简单的列名称。Nu 会接受列路径并输出表中相应的数据。

你可能已经注意到其他一些不同之处:我们没有一个数据表,而只有一个元素:即字符串 “jt”。Nu 既能处理数据表,也能处理字符串。字符串是使用 Nu 外部命令的一个重要部分。

让我们看看字符串在 Nu 外部命令里面是如何工作的。我们以之前的例子为例,运行外部的echo命令(^告诉 Nu 不要使用内置的echo命令):

> sys | get host.sessions.name | each { |it| ^echo $it }
jt

敏锐的读者可能会发现这看起来和我们之前的非常相似!确实如此,但有一个重要的区别:我们用前面的值调用了^echo。这允许我们把数据从 Nu 中传到外部命令echo(或者 Nu 之外的任何命令,比如git)。

#获取帮助

任何 Nu 的内置命令的帮助文本都可以通过help命令来找到。要查看所有命令,请运行help commands。你也可以通过执行help -f <topic>来搜索一个主题:

> help path
Explore and manipulate paths.

There are three ways to represent a path:

* As a path literal, e.g., '/home/viking/spam.txt'
* As a structured path: a table with 'parent', 'stem', and 'extension' (and
* 'prefix' on Windows) columns. This format is produced by the 'path parse'
  subcommand.
* As an inner list of path parts, e.g., '[[ / home viking spam.txt ]]'.
  Splitting into parts is done by the `path split` command.

All subcommands accept all three variants as an input. Furthermore, the 'path
join' subcommand can be used to join the structured path or path parts back into
the path literal.

Usage:
  > path

Subcommands:
  path basename - Get the final component of a path
  path dirname - Get the parent directory of a path
  path exists - Check whether a path exists
  path expand - Try to expand a path to its absolute form
  path join - Join a structured path or a list of path parts.
  path parse - Convert a path into structured data.
  path relative-to - Get a path as relative to another path.
  path split - Split a path into parts by a separator.
  path type - Get the type of the object a path refers to (e.g., file, dir, symlink)

Flags:
  -h, --help
      Display this help message

安装 Nu

有很多方法可以获取并使用 Nu。你可以从我们的发布页面open in new window下载预编译的二进制文件,也可以 使用你喜欢的软件包管理器open in new window,或者从源码构建。

#预编译二进制包

Nu 二进制文件在 GitHub 的 Release 页open in new window发布,适用于 Linux、macOS 和 Windows。只需下载并解压二进制文件,然后将其复制到你的系统PATH上的某个位置即可。

#软件包管理器

Nu 可以通过几个软件包管理器获得:

nushell 一种新的Shell 利用管道控制任意系统

对于 macOS 和 Linux,Homebrewopen in new window是一个流行的选择(brew install nushell)。

对于 Windows 用户:

Nushell 的主要二进制文件被命名为 nu(或 Windows 下的 nu.exe)。安装完成后你可以通过输入 nu 来启动它。

#从源码构建

你也可以从源代码构建Nu。首先,你需要设置 Rust 工具链和它的依赖项。

#安装编译器套件

为了使 Rust 能够正常工作,你需要在你的系统上安装一个兼容的编译器套件。以下是推荐的编译器套件:

#安装 Rust

如果我们的系统中还没有 Rust,最好的方法是通过 rustupopen in new window 来安装它。Rustup 是一种管理 Rust 安装的工具,可以管理使用不同的 Rust 版本。

Nu 目前需要 最新(1.60 或更高)的稳定 版本的 Rust。最好的方法是让rustup为你找到正确的版本。当你第一次打开rustup时,它会询问你想安装哪个版本的 Rust:

Current installation options:

default host triple: x86_64-unknown-linux-gnu
default toolchain: stable
profile: default
modify PATH variable: yes

1) Proceed with installation (default)
2) Customize installation
3) Cancel installation

一旦我们准备好了,我们就按 1,然后回车。

如果你不愿意通过rustup来安装 Rust,你也可以通过其他方法来安装它(比如从 Linux 发行版的软件包中)。只要确保安装 1.60 或更高版本的 Rust 即可。

#依赖

#Debian/Ubuntu

你将需要安装 “pkg-config” 和 “libssl-dev” 包:

apt install pkg-config libssl-dev

对于希望使用 “rawkey” 或 “clipboard” 可选功能的 Linux 用户,需要安装 “libx11-dev” 和 “libxcb-composite0-dev” 软件包。

apt install libxcb-composite0-dev libx11-dev

#基于 RHEL 的发行版

你需要安装 “libxcb”、”openssl-devel” 和 “libX11-devel”:

yum install libxcb openssl-devel libX11-devel

#macOS

使用 Homebrewopen in new window,你需要通过如下方式安装 “openssl” 和 “cmake” :

brew install openssl cmake

#使用 crates.ioopen in new window进行构建

Nu 发行版会作为源码发布到流行的 Rust 包仓库 crates.ioopen in new window,这使得使用 cargo 构建并安装最新的 Nu 版本变得很容易:

> cargo install nu

如此即可! cargo工具将完成下载 Nu 及其源码依赖,构建并将其安装到 cargo bin 路径中,以便我们能够运行它。

如果你想安装更多的功能,你可以使用:

> cargo install nu --features=dataframe

安装完毕后,我们可以使用 nu 命令运行 Nu:

File not found

#从 GitHub 仓库构建

我们也可以从 GitHub 上的最新源码构建自己的 Nu。这让我们可以立即获得最新的功能和错误修复。首先,克隆源码仓库:

> git clone https://github.com/nushell/nushell.git

然后,我们可以用以下方式构建和运行 Nu:

> cd nushell
nushell> cargo build --workspace; cargo run

你也可以在发布模式下构建和运行 Nu:

nushell> cargo build --release --workspace; cargo run --release

熟悉 Rust 的人可能会问,如果 “run” 默认会构建,为什么我们还要做 “build” 和 “run” 这两个步骤?这是为了解决 Cargo 中新的 default-run 选项的缺陷,并确保所有插件都被构建,尽管这在将来可能不再需要。

#设置登录 Shell (*nix)

!!! Nu 仍在开发中,对于日常使用可能并不稳定。!!!

要设置登录 Shell,你可以使用chshopen in new window命令。 一些 Linux 发行版有一个位于/etc/shells的有效 Shell 列表,在 Nu 被列入白名单之前不允许改变 Shell。如果你没有更新shells文件,你可能会看到类似于下面的错误:

chsh: /home/username/.cargo/bin/nu is an invalid shell

你可以通过在shells文件中添加你的 Nu 二进制文件来把 Nu 添加到允许的 Shells 列表中。 添加的路径可以用which nu命令找到,通常是$HOME/.cargo/bin/nu

#设置默认的 Shell (Windows 终端)

如果你使用的是 Windows Terminalopen in new window,你可以通过添加如下内容到你的终端设置"profiles"(JSON 文件)中来设置nu作为你的默认 Shell:

{
  "guid": "{2b372ca1-1ee2-403d-a839-6d63077ad871}",
  "hidden": false,
  "icon": "https://www.nushell.sh/icon.png",
  "name": "Nu Shell",
  "commandline": "nu.exe"
}

最后需要做的是将 "defaultProfile" 改为:

"defaultProfile": "{2b372ca1-1ee2-403d-a839-6d63077ad871}",

之后,nu 应该会在 Windows Terminal 启动时被加载。

nushell使用手册

https://www.nushell.sh/zh-CN/book/

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
干货分享

Rocksdb原理简介

2023-5-26 11:34:52

干货分享

云服务器虚拟化超分与虚机性能关系分析

2023-5-29 17:02:17

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索