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 特定功能,包括 chcon 和 runcon,请确保 libselinux
和 libclang 已安装在您的系统上。然后,运行以下命令:
cargo build --release --features unix,feat_selinux
通过使用 OpenSSL 的 libcrypto 而不是
纯 Rust 摘要 crate,来加速校验和实用工具(md5sum、sha1sum、sha224sum、sha256sum、
sha384sum、sha512sum 和 cksum),请启用 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 补全,
适用于 bash、fish 和 zsh。elvish 和 powershell 的补全
也可以生成;参见 Manually install shell completions。
若要跳过补全和 man 页面的安装:
make COMPLETIONS=n MANPAGES=n install
手动安装 shell 补全
uudoc 二进制文件会为 bash、elvish、
fish、powershell 和 zsh 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 (许多缺失)。
贡献
若要为 uutils 做出贡献,请参阅 CONTRIBUTING。
许可证
uutils 采用 MIT 许可证 - 详见 LICENSE 文件
GNU Coreutils 采用 GPL 3.0 或更高版本许可证。