6.54. Coreutils-8.31

Coreutils 软件包包含用于显示和设置基本系统特性的工具。

大致构建用时: 2.5 SBU
所需磁盘空间: 202 MB

6.54.1. 安装 Coreutils

POSIX 要求 Coreutils 中的程序即使在多字节语言环境也能正确识别字符边界。下面的补丁修复这个不兼容性以及其它一些和国际化相关的错误。

patch -Np1 -i ../coreutils-8.31-i18n-1.patch
[注意]

注意

之前在这个补丁中发现了很多错误。当向 Coreutils 维护者报告新错误的时候,请先检查没有该补丁是否可以重现该错误。

抑制测试在某些机器上可能出现的无限循环:

sed -i '/test.lock/s/^/#/' gnulib-tests/gnulib.mk

现在准备编译 Coreutils:

autoreconf -fiv
FORCE_UNSAFE_CONFIGURE=1 ./configure \
            --prefix=/usr            \
            --enable-no-install-program=kill,uptime

配置选项的含义:

autoreconf

此命令更新已有的配置文件,以使其和 automake 最新生成的一致。

FORCE_UNSAFE_CONFIGURE=1

该环境变量允许以 root 用户权限编译软件包。

--enable-no-install-program=kill,uptime

该选项的目的是防止 Coreutils 安装其它软件包后面会安装的二进制包。

编译软件包:

make

如果不运行测试套件的话跳到「安装软件包」

现在可以运行测试套件了。首先,运行需要以 root 用户运行的测试:

make NON_ROOT_USERNAME=nobody check-root

我们会以 nobody 用户运行剩下的测试。但是,一些测试要求用户属于多个组。为了不跳过这些测试,我们会添加一个临时的组并添加用户 nobody 作为它的成员:

echo "dummy:x:1000:nobody" >> /etc/group

修复一些权限问题以便非 root 用户可以编译和运行测试:

chown -Rv nobody . 

现在运行测试。确保 su 环境中的 PATH 环境变量包含了 /tools/bin。

su nobody -s /bin/bash \
          -c "PATH=$PATH make RUN_EXPENSIVE_TESTS=yes check"

已知测试程序 test-getlogin 在部分构建的系统环境(如 chroot 环境)中会失败,章节结束后运行便会通过。已知测试程序 tty.sh 也会失败。

移除临时组:

sed -i '/dummy/d' /etc/group

安装软件包:

make install

移动程序到 FHS 指定的位置:

mv -v /usr/bin/{cat,chgrp,chmod,chown,cp,date,dd,df,echo} /bin
mv -v /usr/bin/{false,ln,ls,mkdir,mknod,mv,pwd,rm} /bin
mv -v /usr/bin/{rmdir,stty,sync,true,uname} /bin
mv -v /usr/bin/chroot /usr/sbin
mv -v /usr/share/man/man1/chroot.1 /usr/share/man/man8/chroot.8
sed -i s/\"1\"/\"8\"/1 /usr/share/man/man8/chroot.8

LFS-Bootscripts 包中的一些脚本依赖于 headnicesleeptouch。由于 /usr 在启动的早期和晚期阶段可能不可用,这些二进制文件需要被存在放在根分区(/bin 目录)以保证 FHS 合规性:

mv -v /usr/bin/{head,nice,sleep,touch} /bin

6.54.2. Coreutils 软件包内容

安装的程序: [, b2sum, base32, base64, basename, basenc, cat, chcon, chgrp, chmod, chown, chroot, cksum, comm, cp, csplit, cut, date, dd, df, dir, dircolors, dirname, du, echo, env, expand, expr, factor, false, fmt, fold, groups, head, hostid, id, install, join, link, ln, logname, ls, md5sum, mkdir, mkfifo, mknod, mktemp, mv, nice, nl, nohup, nproc, numfmt, od, paste, pathchk, pinky, pr, printenv, printf, ptx, pwd, readlink, realpath, rm, rmdir, runcon, seq, sha1sum, sha224sum, sha256sum, sha384sum, sha512sum, shred, shuf, sleep, sort, split, stat, stdbuf, stty, sum, sync, tac, tail, tee, test, timeout, touch, tr, true, truncate, tsort, tty, uname, unexpand, uniq, unlink, users, vdir, wc, who, whoami, and yes
安装的库: libstdbuf.so (位于 /usr/libexec/coreutils)
安装目录: /usr/libexec/coreutils

简要介绍

base32

根据 base32(RFC 4648)规范编码和解码数据

base64

根据 base64(RFC 4648)规范编码和解码数据

b2sum

打印或查看 BLAKE2 (512-bit) 校验和

basename

从文件名称中抽取路径和后缀

basenc

使用各种算法对数据进行编码或解码

cat

将文件连接到标准输出

chcon

改变文件和目录的安全上下文

chgrp

更改文件和目录的组所有者

chmod

更改每个文件为指定模式的权限;模式可以是要实现更改的符号表示 或者表示新权限的十进制数字

chown

更改文件和目录的用户和/或组所有者

chroot

使用指定目录作为 / 目录运行命令

cksum

输出指定文件的循环冗余检验(CRC)校验码和字节数目

comm

比较两个排序后的文件,以三列输出不用的行和相同的行

cp

复制文件

csplit

将指定文件分割为几个新的文件,根据指定的模式或者行数分割并 输出每个新文件的字节数

cut

根据指定的域或位置,选择输出行的组成

date

根据指定格式显示当前时间,或设置系统日期

dd

用给定的块大小和数目复制文件,同时可以进行一些转换

df

报告所有挂载的文件系统中可用(和已用)磁盘空间,或只是 含有指定文件的文件系统

dir

列出指定目的的内容(和 ls 命令相同)

dircolors

输出设置 LS_COLOR 环境变量的命令,用于更改 ls 使用的颜色模式

dirname

从一个文件名称中抽取非目录后缀

du

报告当前目录使用的磁盘空间,根据指定的每个文件夹(包括子文件夹) 或每个指定的文件

echo

显示给定的字符串

env

在更改后的环境中运行命令

expand

把 tab 键转换为空格

expr

计算表达式

factor

输出所有指定整数的质数因子

false

什么都不做;总是以指示失败的状态码退出

fmt

重新格式化给定文件中的段落

fold

折叠指定文件的行

groups

报告一个用户的组成员

head

输出指定文件的前十行(或指定数目行数)

hostid

报告主机的数字标识符(以十六进制)

id

报告当前用户或指定用户的有效 用户 ID、组 ID 以及组成员

install

复制文件的同时设置权限模式,如果可以的话包括用户和组

join

从两个单独的文件中连接有相同域的行

link

用指定的名称创建到一个文件的硬链接

ln

在文件之间建立硬链接或软(符号)链接

logname

报告当前用户的登录名

ls

列出给定目录的内容

md5sum

报告或检查消息摘要 5(MD5) 校验码

mkdir

用指定的名称新建目录

mkfifo

用指定的名称在 UNIX 中创建先进先出(FIFO) 的「命名管道」

mknod

用指定的名称创建设备结点;设备结点是一个特殊字符文件、特殊块文件或先进先出

mktemp

以安全方式新建临时文件;在脚本中使用

mv

移动或重命名文件或目录

nice

以更改后的调度优先级运行程序

nl

标记指定文件的行号

nohup

以不能被挂起方式运行命令,输出重定向到一个日志文件

nproc

输出进程可用的处理单元数目

numfmt

转换数字为人可读字符串或者相反

od

以十进制或其他格式转储文件

paste

合并指定文件,用 tab 字符分隔,以行并列方式连续合并

pathchk

检查文件名是否可用

pinky

轻量级的 finger 客户端;报告指定用户的信息

pr

对文件进行分页分行用于打印

printenv

输出环境

printf

根据指定格式打印指定参数,类似于 C 语言的 printf 函数

ptx

用文中的每个关键字,根据文件的内容中建立重排索引

pwd

报告当前工作目录的名称

readlink

报告指定符号链接的值

realpath

打印解释后路径

rm

删除文件或目录

rmdir

如果目录为空则删除

runcon

以指定安全上下文运行命令

seq

用指定的范围和增长步长输出一序列数字

sha1sum

打印或检查 160-bit 安全哈希算法1(SHA1) 校验码

sha224sum

打印或检查 224-bit 安全哈希算法校验码

sha256sum

打印或检查 256-bit 安全哈希算法校验码

sha384sum

打印或检查 384-bit 安全哈希算法校验码

sha512sum

打印或检查 512-bit 安全哈希算法校验码

shred

用复杂形式多次重写指定文件,使得难以恢复其中的数据

shuf

打乱文本行

sleep

暂停指定时间

sort

排序给定文件的行

split

根据大小或行数分割文件为多个块

stat

显示文件或文件系统状态

stdbuf

用改变后的缓冲操作在标准流上运行命令

stty

设置或报告终端行设置

sum

打印指定文件的校验码和块数目

sync

清空文件系统缓存;强制更改块到磁盘并更新超级块

tac

反向输出给定文件

tail

输出每个给定文件的最后十行(或给定数目的行)

tee

从标准输入读入并写出到标准输出和指定文件

test

比较值并检查文件类型

timeout

有限时间内运行命令

touch

更改文件时间戳,设置指定文件的访问和修改时间为当前时间; 如果文件不存在则创建空文件

tr

从标准输入转换、压缩并删除指定字符

true

不做任何事情,总是成功;总是以表示成功的状态码退出

truncate

压缩或扩展文件到特定大小

tsort

进行拓扑排序;根据指定文件的部分排序写出完全有序列表

tty

报告链接到标准输入的终端文件名称

uname

报告系统信息

unexpand

转换空格为 tab 键

uniq

忽略所有除非出现连续相同的行

unlink

移除指定文件

users

报告当前登录的用户名

vdir

ls -l 相同

wc

报告给定文件的行数、单词数和字节数,以及给定多个文件时总的行数

who

报告谁登录了

whoami

报告和当前有效用户 ID 关联的用户名

yes

重复输出「y」或指定的字符串直到被杀死

libstdbuf

stdbuf 使用的库