ITADN
uutils/coreutils
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

uutils logo

uutils coreutils

Crates.io Discord License dependency status

CodeCov Weblate


uutils coreutils 是 GNU coreutils 的跨平台重新实现, 采用 Rust。尽管所有程序均已实现,但某些 选项可能缺失,或者可能会遇到不同的行为。

我们提供来自 main 分支的预编译二进制文件、manpages 和 shell 补全,位于 https://github.com/uutils/coreutils/releases/tag/latest-commit 。 最新的稳定标签 https://github.com/uutils/coreutils/releases/latest 同样存在,用于可复现的产品和打包者。 Bug 报告者应使用来自最新 commit 的二进制文件。

最低兼容的 glibc 版本与 ubuntu-latest runner 相同。如果 coreutils-*-gnu 与您的系统不兼容,请使用 coreutils-*-musl

目标

uutils coreutils 旨在成为 GNU utils 的直接替代品。与 GNU 的差异被视为缺陷。

我们的主要目标包括:

  • 完全匹配 GNU 的输出(stdout 和错误代码)
  • 更好的错误信息
  • 提供全面的国际化支持(UTF-8)
  • 提升性能
  • 在相关情况下提供扩展(例如:--progress)

uutils 旨在尽可能支持更多平台,以便在 Linux、macOS、*BSD、Windows、WASI 和其他平台上使用相同的 utils。这确保了,例如,脚本可以轻松地在平台之间迁移。

自 25.10 版本起,uutils coreutils 默认随 Ubuntu 发行。

文档

uutils 同时提供用户文档和开发者文档:

两者也可以在本地生成,相关说明可在 coreutils docs 仓库中找到。

使用 weblate/rust-coreutils 将 Rust coreutils 翻译成你的语言。

你可以通过 WebAssembly playground 在浏览器中试用这些工具, 无需安装任何内容。

要求

  • Rust (cargo, rustc)
  • GNU Make(可选)

Rust 版本

uutils 遵循 Rust 的发布渠道,并在 stable、beta 和 nightly 上进行测试。

构建

目前有两种构建 uutils 二进制文件的方法:使用 Cargo 或 GNU Make。

在 Unix 平台上构建包含所有文档的完整软件包,需要同时使用 Cargo 和 GNU Make。

无论采用哪种方法,我们首先需要获取该仓库:

git clone https://github.com/uutils/coreutils
cd coreutils

Cargo

使用 Cargo 构建 uutils 很简单,因为该过程与其他所有 Rust 程序相同:

cargo build --release

--release 替换为 --profile=release-small 以优化二进制大小。

此命令在大多数 Rust 支持的平台上将最通用的 uutils 核心集合构建为一个多调用(BusyBox 类型)二进制文件,命名为 'coreutils'。

通常还可用到额外的平台特定 uutils。在特定平台上构建这些扩展的 uutils 集合,只需将其指定为一个 feature 即可:

cargo build --release --features windows
# or ...
cargo build --release --features unix
# or ...
cargo build --release --target wasm32-wasip1 --no-default-features --features feat_wasm

要构建 SELinux 特定功能,包括 chconruncon,请确保 libselinuxlibclang 已安装在您的系统上。然后,运行以下命令:

cargo build --release --features unix,feat_selinux

通过使用 OpenSSL 的 libcrypto 而不是 纯 Rust 摘要 crate,来加速校验和实用工具(md5sumsha1sumsha224sumsha256sumsha384sumsha512sumcksum),请启用 openssl 功能:

cargo build --release --features unix,openssl

默认情况下,OpenSSL 从源代码构建并静态链接到 二进制文件中(类似于 expr 链接 oniguruma 的方式),因此不会添加 对系统 libcrypto/libssl 的运行时依赖。若要改为动态链接系统 libcrypto,请在构建时设置 OPENSSL_NO_VENDOR=1

在没有 SHA-NI 硬件加速的 CPU 上,速度提升最为显著。该 功能在 Windows 上是空操作(在那里始终使用 纯 Rust 实现),并且对于 libcrypto 拒绝的任何算法(例如严格 FIPS 模式下的 MD5), 在运行时会自动绕过。

如果您不想将平台上可用的所有实用工具都构建到 最终二进制文件中,您也可以手动指定要构建哪些工具。例如:

cargo build --features "base32 cat echo rm" --no-default-features

如果您想将这些实用工具构建为独立的二进制文件,这也是可行的:

cargo build --release --bins --workspace --exclude coreutils --exclude uu_runcon --exclude uu_chcon

每个实用工具都包含在主仓库中各自的包内,命名为 "uu_UTILNAME"。要构建选定的独立实用工具,请使用 --package [又称 -p] 选项。例如:

cargo build -p uu_base32 -p uu_cat -p uu_echo -p uu_rm

GNU Make

使用 make 进行构建同样是一个简单的过程。

若要构建所有可用的实用工具(使用调试配置):

make

在发布模式下:

make PROFILE=release

要构建除少数之外的所有可用实用工具:

make SKIP_UTILS='UTILITY_1 UTILITY_2'

仅构建可用的部分实用工具:

make UTILS='UTILITY_1 UTILITY_2'

安装

使用 Cargo 安装

同样,安装可以简单地使用以下命令完成:

cargo install --path . --locked

此命令会将 uutils 安装到 Cargo 的 bin 文件夹中(例如 $HOME/.cargo/bin)。

这不会安装 shell 补全或 manpages 所需的文件。要使 manpages 或 shell 补全正常工作,请使用 GNU Make 或参见 Manually install shell completions/Manually install manpages

使用 GNU Make 安装

要安装所有可用的实用工具(默认 PROFILE=release):

make install

要使用 sudo 进行安装,必须使用 -E 开关:

sudo -E make install

要安装除少数之外的所有可用实用工具:

make SKIP_UTILS='UTILITY_1 UTILITY_2' install

要仅安装部分可用的实用工具:

make UTILS='UTILITY_1 UTILITY_2' install

要使用前缀(例如 uu-echo uu-cat)安装所有程序:

make PROG_PREFIX=uu- install

要安装 multicall 二进制文件:

make MULTICALL=y install

设置安装父目录(默认值为 /usr/local):

# DESTDIR is also supported
make PREFIX=/my/path install

使用 make 安装会为所有已安装的工具生成 shell 补全, 适用于 bashfishzshelvishpowershell 的补全 也可以生成;参见 Manually install shell completions

若要跳过补全和 man 页面的安装:

make COMPLETIONS=n MANPAGES=n install

手动安装 shell 补全

uudoc 二进制文件会为 bashelvishfishpowershellzsh shell 生成补全并输出到 stdout。

通过

cargo install --bin uudoc --features uudoc --path .
``` 安装 `uudoc`

然后使用已安装的二进制文件:
```shell
uudoc completion <utility> <shell>

因此,要在 bash 上为 ls 安装补全到 /usr/local/share/bash-completion/completions/ls,请运行:

uudoc completion ls bash > /usr/local/share/bash-completion/completions/ls.bash

zsh 上,使用 uu- 为带前缀的 cp 生成的补全由

env PROG_PREFIX=uu- uudoc completion cp zsh
``` 生成

### 手动安装 manpages

要生成 manpages,语法如下:

```bash
uudoc manpage <utility>

因此,要将 ls 的手册页安装到 /usr/local/share/man/man1/ls.1,请运行:

uudoc manpage ls > /usr/local/share/man/man1/ls.1

卸载

卸载方式取决于你安装 uutils 的方式。如果你使用 Cargo 安装,请使用 Cargo 卸载。如果你使用 GNU Make 安装,请使用 Make 卸载。

使用 Cargo 卸载

要卸载 uutils:

cargo uninstall coreutils

使用 GNU Make 卸载

要卸载所有实用工具:

make uninstall

要卸载所有具有特定前缀的程序:

make PROG_PREFIX=uu- uninstall

要卸载 multicall 二进制文件:

make MULTICALL=y uninstall

要从自定义父目录卸载:

# DESTDIR is also supported
make PREFIX=/my/path uninstall

GNU 测试套件兼容性

以下是 uutils 通过的 GNU 测试数量的演变过程。主分支 GNU 测试结果的更详细 分解可在用户手册中找到。

参见 https://github.com/orgs/uutils/projects/1 了解主要元 bug (许多缺失)。

Evolution over time

贡献

若要为 uutils 做出贡献,请参阅 CONTRIBUTING

许可证

uutils 采用 MIT 许可证 - 详见 LICENSE 文件

GNU Coreutils 采用 GPL 3.0 或更高版本许可证。