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

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

nushell简介

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

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

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

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

Nushell 项目介绍

你好,欢迎来到 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
╭───────┬───────────────────╮
│ 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)。

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

获取帮助

任何 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 利用管道控制任意系统

open in new window

对于 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 的方式思考

为了帮助你理解并充分利用 Nushell,我们把这部分内容一起放入”以 Nushell 的方式思考”这一节。通过学习 Nushell 的思考方式,并使用它提供的模式,你会在开始时遇到更少的问题,并为接下来的成功做好准备。

那么,用 Nushell 的方式思考是什么意思呢?下面是一些 Nushell 新用户常见的问题。

Nushell 不是 Bash

Nushell 既是一种编程语言,也是一种 Shell,正因为如此,它有自己的方式来处理文件、目录、网站等等。我们对其进行了建模,以使其与你可能熟悉的其他 Shell 的工作方式接近。其中管道用于将两个命令连接在一起:

> ls | length

Nushell 也支持其他常见的功能,例如从之前运行的命令中获取退出代码(Exit Code)。

虽然它确实有这些功能,但 Nushell 并不是 Bash。Bash 的工作方式以及一般的 POSIX 风格,并不是 Nushell 所支持的。例如,在 Bash 中你可以使用:

> echo "hello" > output.txt

在 Nushell 中,我们使用>作为大于运算符,这与 Nushell 的语言特质比较吻合。取而代之的是,你需要用管道将其连接到一个可以保存内容的命令:

> echo "hello" | save output.txt

以 Nushell 的方式思考: Nushell 看待数据的方式是,数据在管道中流动,直到它到达用户或由最后的命令处理。Nushell 使用命令来完成工作,学习这些命令以及何时使用它们有助于你组合使用多种管道。

把 Nushell 想象成一种编译型语言

Nushell 设计的一个重要部分,特别是它与许多动态语言不同的地方是,Nushell 将你提供给它的源代码转换成某种可执行产物,然后再去运行它。Nushell 没有 eval 功能,因此也不允许你在运行时继续拉入新的源代码。这意味着对于诸如引入文件使其成为你项目的一部分这样的任务,需要知道文件的具体路径,就如同 C++或 Rust 等编译语言中的文件引入一样。

例如,下面的代码在 Nushell 中是没有意义的,如果作为脚本将无法执行:

echo "def abc [] { 1 + 2 }" | save output.nu
source "output.nu"
abc

source 命令将引入被编译的源码,但前面那行 save 命令还没有机会运行。Nushell 运行整个程序块就像运行一个文件一样,而不是一次运行一行。在这个例子中,由于output.nu文件是在 “编译” 步骤之后才创建的,因此 source 命令在解析时无法从其中读取定义。

另一个常见的问题是试图动态地创建文件名并source,如下:

> source $"($my_path)/common.nu"

这就需要求值器(Evaluator)运行并对字符串进行求值(Evaluate),但不幸的是,Nushell 在编译时就需要这些信息。

以 Nushell 的方式思考: Nushell 被设计为对你输入的所有源代码使用一个单一的“编译”步骤,这与求值是分开的。这将允许强大的 IDE 支持,准确的错误提示,并成为第三方工具更容易使用的语言,以及在未来甚至可以有更高级的输出,比如能够直接将 Nushell 编译为二进制文件等。

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

变量是不可变的

对于来自其他语言的人来说,另一个常见的令人惊愕之处是 Nushell 的变量是不可变的(事实上,有些人已经开始称它们为 “常量” 来反映这一点)。接触 Nushell,你需要花一些时间来熟悉更多的函数式风格,因为这往往有助于写出与不可变的变量最相容的代码。

你可能想知道为什么 Nushell 使用不可变的变量,在 Nushell 开发的早期,我们决定看看我们能在语言中使用多长时间的以数据为中心的函数式风格。最近,我们在 Nushell 中加入了一个关键的功能,使这些早期的实验显示出其价值:并行性。通过在任何 Nushell 脚本中将each切换到par-each,你就能够在 “输入” 上并行地运行相应的代码块。这是可能的,因为 Nushell 的设计在很大程度上依赖于不可变性、组合和流水线。

Nushell 的变量是不可变的,但这并不意味着无法表达变化。Nushell 大量使用了 “Shadowing” 技术(变量隐藏)。变量隐藏是指创建一个与之前声明的变量同名的新变量,例如,假设你有一个$x在当前作用域内,而你想要一个新的$x并将其加 1:

let x = $x + 1

这个新的x对任何跟在这一行后面的代码都是可见的。谨慎地使用变量隐藏可以使变量的使用变得更容易,尽管这不是必须的。

循环计数器是可变变量的另一种常见模式,它被内置于大多数迭代命令中,例如,你可以使用each上的-n标志同时获得每个元素的值和索引:

> ls | enumerate | each { |it| $"Number ($it.index) is size ($it.item.size)" }

你也可以使用reduce命令来达到上述目的,其方式与你在循环中修改一个变量相同。例如,如果你想在一个字符串列表中找到最长的字符串,你可以这样做:

> [one, two, three, four, five, six] | reduce {|curr, max|
    if ($curr | str length) > ($max | str length) {
        $curr
    } else {
        $max
    }
}

以 Nushell 的方式思考: 如果你习惯于使用可变的变量来完成不同的任务,那么你将需要一些时间来学习如何以更加函数式的方式来完成每个任务。Nushell 有一套内置的能力来帮助处理这样的模式,学习它们将帮助你以更加 Nushell 的风格来写代码。由此带来的额外的好处是你可以通过并行运行你的部分代码来加速脚本执行。

Nushell 的环境是有作用域的

Nushell 从编译型语言中获得了很多设计灵感,其中一个是语言应该避免全局可变状态。Shell 经常通过修改全局变量来更新环境,但 Nushell 避开了这种方法。

在 Nushell 中,代码块可以控制自己的环境,因此对环境的改变是发生在代码块范围内的。

在实践中,这可以让你用更简洁的代码来处理子目录,例如,如果你想在当前目录下构建每个子项目,你可以运行:

> ls | each { |it|
    cd $it.name
    make
}

cd命令改变了PWD环境变量,这个变量的改变只在当前代码块有效,如此即可允许每次迭代都从当前目录开始,进入下一个子目录。

环境变量具有作用域使命令更可预测,更容易阅读,必要时也更容易调试。Nushell 还提供了一些辅助命令,如def-envload-env,作为对环境变量进行批量更新的辅助方法。

* – 这里有一个例外,def-env允许你创建一个可以修改并保留调用者环境的命令

以 Nushell 的方式思考: 在 Nushell 中,没有全局可修改变量的编码最佳实践延伸到了环境变量。使用内置的辅助命令可以让你更容易地处理 Nushell 中的环境变量问题。利用环境变量对代码块具有作用范围这一事实,也可以帮助你写出更简洁的脚本,并与外部命令互动,而不需要在全局环境中添加你不需要的东西。

在系统中四处移动

早期的 Shell 允许你在文件系统中进行目录跳转并运行命令,而现代的 Shell 如 Nu 也允许你这样做。让我们来看看你在与系统交互时可能会用到的一些常用命令。

查看目录内容

> ls

正如我们在其他章节中所看到的,ls是一个用于查看路径内容的命令。Nu 将以表格的形式返回内容并供我们使用。

ls命令还需要一个可选的参数,以改变你想查看的内容。例如,我们可以列出以 “.md ” 结尾的文件:

> 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 
───┴────────────────────┴──────┴─────────┴────────────

上述可选参数 “*.md” 中的星号(*)有时被称为通配符或 Glob,它让我们可以匹配任何东西。你可以把 glob “*.md” 理解为 “匹配以 ‘.md’ 结尾的任何文件名”

Nu 也使用现代 Globs,它允许你访问更深的目录:

 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
 4 │ crates/nu-source/README.md                │ File │  1.7 KB │ 5 days ago
 5 │ docker/packaging/README.md                │ File │  1.5 KB │ 5 days ago
 6 │ docs/commands/README.md                   │ File │   929 B │ 5 days ago
 7 │ docs/commands/alias.md                    │ File │  1.7 KB │ 5 days ago
 8 │ docs/commands/append.md                   │ File │  1.4 KB │ 5 days ago

在这里,我们要寻找任何以”.md” 结尾的文件,两个星号进一步表示 “从这里开始的任何目录中”。

改变当前目录

> cd new_directory

要从当前目录换到一个新目录,我们使用 cd 命令。就像在其他 Shells 中一样,我们可以使用目录的名称,或者如果我们想进入父目录,我们可以使用..的快捷方式。

如果 cd 被省略,只给出一个路径本身,也可以改变当前工作目录:

> ./new_directory

注意: 用 cd 改变目录会改变PWD环境变量。这意味着目录的改变会保留到当前代码块中,一旦你退出这个代码块,你就会返回到以前的目录。你可以在 环境篇 中了解更多关于这方面的信息。

文件系统命令

Nu 还提供了一些基本的文件系统命令,并且可以跨平台工作。

我们可以使用 mv 命令将一个目录或文件从一个地方移动到另一个地方:

> mv item location

我们可以通过 cp 命令把一个目录或文件从一个地方复制到另一个地方:

> cp item location

我们也可以通过 rm 命令删除一个目录或文件:

> rm item

这三个命令也可以使用我们先前看到的ls的 Glob 功能。

最后,我们可以使用 mkdir 命令创建一个新目录:

> mkdir new_directory

nushell使用手册

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

转载请注明出处及链接

Leave a Reply

您的电子邮箱地址不会被公开。 必填项已用 * 标注