6.14. Coreutils-5.96
最后更新于:2022-04-01 22:49:28
# 6.14\. Coreutils-5.96
Coreutils 软件包包括一套显示、设置基本系统属性的工具。
**预计编译时间:** 1.1 SBU**所需磁盘空间:** 58.3 MB
## 6.14.1\. 安装 Coreutils
通常 `uname` 程序总是有点毛病的,比如 _`-p`_unknown 的结果。下面的补丁对 Intel 平台的机器能修正这个问题:
```
patch -Np1 -i ../coreutils-5.96-uname-1.patch
```
阻止 Coreutils 安装后面将由别的包安装的程序:
```
patch -Np1 -i ../coreutils-5.96-suppress_uptime_kill_su-1.patch
```
POSIX 要求 Coreutils 的程序即使在多字节环境下也能够识别出字符的边界。下面的这个patch能够解决这个问题以及其他的一些国际化相关的问题:
```
patch -Np1 -i ../coreutils-5.96-i18n-1.patch
```
为了测试应用的patch能够运行,修改文件的权限:
```
chmod +x tests/sort/sort-mb-tests
```
### 注意
过去,在这个patch里面发现了很多bug。当你向 Coreutils 的维护者发送错误报告的时候,首先确认不应用这个patch错误会不会出现。
现在已经发现在使用`who -Hu`时,转换的信息有时会导致缓冲区溢出。增大缓冲区大小:
```
sed -i 's/_LEN 6/_LEN 20/' src/who.c
```
为编译 Coreutils 做准备:
```
./configure --prefix=/usr
```
编译软件包:
```
make
```
Coreutils 软件包的测试套件对系统进行了某些假设,比如要求有非 root 用户和组,但是我们目前的系统中尚不存在。如果你不想运行测试套件,就直接跳过下面将要进行的测试,直接从"安装软件包"那里继续。
下面的命令为我们做测试前的准备,创建两个 dummy(伪) 组和一个 dummy(伪) 用户:
```
echo "dummy1:x:1000:" >> /etc/group
echo "dummy2:x:1001:dummy" >> /etc/group
echo "dummy:x:1000:1000::/root:/bin/bash" >> /etc/passwd
```
现在已经准备好可以运行测试套件了,首先运行那些需要以 `root` 运行的测试:
```
make NON_ROOT_USERNAME=dummy check-root
```
然后以 `dummy` 用户运行剩余的测试:
```
src/su dummy -c "make RUN_EXPENSIVE_TESTS=yes check"
```
测试结束后,删除 dummy 组和用户:
```
sed -i '/dummy/d' /etc/passwd /etc/group
```
安装软件包:
```
make install
```
把一些程序移动到合适的位置以符合 FHS 标准:
```
mv -v /usr/bin/{cat,chgrp,chmod,chown,cp,date,dd,df,echo} /bin
mv -v /usr/bin/{false,hostname,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
```
一些 LFS-Bootscripts 包中的脚本依赖于 `head`, `sleep`,和 `nice` 。由于 /usr 目录有可能在系统启动过程的早期不可用(比如尚未挂载),所以这些二进制程序需要放置在根分区上:
```
mv -v /usr/bin/{head,sleep,nice} /bin
```
## 6.14.2\. Coreutils 的内容
**安装的程序:** basename, cat, 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, hostname, id, install, join, link, ln, logname, ls, md5sum, mkdir, mkfifo, mknod, mv, nice, nl, nohup, od, paste, pathchk, pinky, pr, printenv, printf, ptx, pwd, readlink, rm, rmdir, seq, sha1sum, shred, sleep, sort, split, stat, stty, sum, sync, tac, tail, tee, test, touch, tr, true, tsort, tty, uname, unexpand, uniq, unlink, users, vdir, wc, who, whoami, yes
### 简要描述
| | |
| --- | --- |
| `basename` | 去掉文件名中的目录和后缀 |
| `cat` | 把文本文件的内容发送到标准输出 |
| `chgrp` | 改变文件和目录属组,属组可以使用组名或者组识别号表示 |
| `chmod` | 改变文件和目录的权限,权限可以使用符号或者八进制两种表达方式 |
| `chown` | 改变文件和目录的所有权(包括用户和/或组) |
| `chroot` | 使用特定的目录作为执行某个命令或者交互 shell 的根目录(/)。在多数系统中,只有 root 用户能运行这个命令 |
| `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` | 显示每个指定文件的前几行(默认是10) |
| `hostid` | 以16进制方式,显示当前主机的数字标志符 |
| `hostname` | 显示或设置主机名 |
| `id` | 显示某个用户或者当前用户的真实和有效的 UID、GID 。 |
| `install` | 复制文件,设置它们的权限,如果可能还设置拥有它们的用户和组 |
| `join` | 合并两个文件的行 |
| `link` | 创建从指定文件到指定名称的硬链接 |
| `ln` | 创建文件之间的硬/软(符号)连接 |
| `logname` | 显示当前用户的登录名 |
| `ls` | 列出指定目录的所有内容。缺省是将文件和子目录按字母顺序排列。 |
| `md5sum` | 显示或者校验 MD5 校验码。 |
| `mkdir` | 建立目录,使用给定的参数作为目录名。 |
| `mkfifo` | 以给定的参数作为名字建立FIFO(又叫"命名管道")文件。 |
| `mknod` | 使用给出的文件名,建立一个设备节点,也就是:FIFO、字符特殊文件(special file)或者块特殊文件(special file)。 |
| `mv` | 根据所给参数的不同,把文件或者目录移动到另外的目录或者将其改名 |
| `nice` | 修改某个进程的调度优先级 |
| `nl` | 把每个指定文件的内容写到标准输出,在每行加上行号 |
| `nohup` | 使某个命令不被挂起,并将输出重定向到一个日志文件。 |
| `od` | 以数字方式显示指定文件的内容,默认为八进制。 |
| `paste` | 将字段连接在一起,在字段之间自动插入分割符,默认的分割符是 Tab 。 |
| `pathchk` | 检查文件名是否是有效的或者是可移植的 |
| `pinky` | 一个轻量级的 finger 客户端,用来得到某个用户的信息。 |
| `pr` | 将文件分成适当大小的页送到打印机 |
| `printenv` | 显示环境变量 |
| `printf` | 根据给定的参数格式化输出数据,与 C 语言中的该函数相似。 |
| `ptx` | 为指定的文件提供一个排序索引 |
| `pwd` | 显示当前工作目录 |
| `readlink` | 显示指定符号链接的值 |
| `rm` | 删除文件或者目录 |
| `rmdir` | 删除目录(目录必需为空) |
| `seq` | 以指定的步长输出一个数列 |
| `sha1sum` | 显示或校验 160 位的 SHA1 校验码 |
| `shred` | 安全删除一个文件,重写其占用的磁盘空间,使其无法恢复。 |
| `sleep` | 延迟一段时间 |
| `sort` | 对文件进行排序 |
| `split` | 把文件分成固定大小(字节或行数)的片断 |
| `stat` | 显示文件或者文件系统的状态 |
| `stty` | 改变和显示终端行的设置 |
| `sum` | 显示指定文件的校验和及块数 |
| `sync` | 刷新文件系统缓冲区,使磁盘和内存的数据同步。 |
| `tac` | 逆向显示指定的文件,最后一行在最前。 |
| `tail` | 显示每个指定文件的最后几行(默认是10)。 |
| `tee` | 从标准输入读取数据,输出到标准输出和指定的文件。 |
| `test` | 检查文件类型,以及进行变量的比较。 |
| `touch` | 把参数指定的文件的访问和修改时间改为当前的时间。如果文件不存在,它就建立一个空文件。 |
| `tr` | 从标准输入读入正文,对字符进行转换、压缩或者删除,然后写到标准输出 |
| `true` | 返回一个成功或者逻辑真的结果 |
| `tsort` | 对给定的文件进行拓扑排序 |
| `tty` | 显示标准输出设备连接终端的文件名 |
| `uname` | 打印系统信息 |
| `unexpand` | 把空格符转换成 tab |
| `uniq` | 抛弃指定文件或者标准输入中内容重复的行 |
| `unlink` | 删除指定文件 |
| `users` | 显示在当前主机登录的用户名 |
| `vdir` | 同 **ls -l** |
| `wc` | 统计文件中包含的字节数、单词数、行数 |
| `who` | 显示有哪些用户登录 |
| `whoami` | 打印当前用户的有效用户标志符 |
| `yes` | 重复输出"y"字符,直到被杀死。 |
';