Coreutils 软件包包含用于显示和设置基本系统特性的工具。
6.29.1. 安装 Coreutils
POSIX 要求 Coreutils 中的程序即使在多字节语言环境也能正确识别字符边界。下面的补丁修复这个不兼容性以及其它一些和国际化相关的 错误。之后确保 Makefile.in
文件的时间戳比其它所有文件都晚以免出现 make 错误:
patch -Np1 -i ../coreutils-8.23-i18n-1.patch touch Makefile.in
注意
之前在这个补丁中发现了很多错误。当向 Coreutils 维护者报告新错误的时候,请先检查没有该补丁是否可以重现该错误。
现在准备编译 Coreutils:
FORCE_UNSAFE_CONFIGURE=1 ./configure \ --prefix=/usr \ --enable-no-install-program=kill,uptime
配置选项的含义:
-
该环境变量允许以 root 用户权限编译软件包。
-
该选项的目的是防止 Coreutils 安装其它软件包后面会安装的二进制包。
FORCE_UNSAFE_CONFIGURE=1
--enable-no-install-program=kill,uptime
编译软件包:
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"
已知在虚拟主控台中 stty-pairs 测试会失败,而在 X 终端中则能通过。
移除临时组:
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
BLFS 以及上游中的一些软件包希望如下的程序放在 /bin
中,确保把它们放到了那里:
mv -v /usr/bin/{head,sleep,nice,test,[} /bin
6.29.2. Coreutils 软件包内容
简要介绍
根据 base64(RFC3548)规范编码和解码数据 | |
从文件名称中抽取路径和后缀 | |
将文件连接到标准输出 | |
改变文件和目录的安全上下文 | |
更改文件和目录的组所有者 | |
更改每个文件为指定模式的权限;模式可以是要实现更改的符号表示 或者表示新权限的十进制数字 | |
更改文件和目录的用户和/或组所有者 | |
使用指定目录作为 | |
输出指定文件的循环冗余检验(CRC)校验码和字节数目 | |
比较两个排序后的文件,以三列输出不用的行和相同的行 | |
复制文件 | |
将指定文件分割为几个新的文件,根据指定的模式或者行数分割并 输出每个新文件的字节数 | |
根据指定的域或位置,选择输出行的组成 | |
根据指定格式显示当前时间,或设置系统日期 | |
用给定的块大小和数目复制文件,同时可以进行一些转换 | |
报告所有挂载的文件系统中可用(和已用)磁盘空间,或只是 含有指定文件的文件系统 | |
列出指定目的的内容(和 ls 命令相同) | |
输出设置 | |
从一个文件名称中抽取非目录后缀 | |
报告当前目录使用的磁盘空间,根据指定的每个文件夹(包括子文件夹) 或每个指定的文件 | |
显示给定的字符串 | |
在更改后的环境中运行命令 | |
把 tab 键转换为空格 | |
计算表达式 | |
输出所有指定整数的质数因子 | |
什么都不做;总是以指示失败的状态码退出 | |
重新格式化给定文件中的段落 | |
折叠指定文件的行 | |
报告一个用户的组成员 | |
输出指定文件的前十行(或指定数目行数) | |
报告主机的数字标识符(以十六进制) | |
报告当前用户或指定用户的有效 用户 ID、组 ID 以及组成员 | |
复制文件的同时设置权限模式,如果可以的话包括用户和组 | |
从两个单独的文件中连接有相同域的行 | |
用指定的名称创建到一个文件的硬链接 | |
在文件之间建立硬链接或软(符号)链接 | |
报告当前用户的登录名 | |
列出给定目录的内容 | |
报告或检查消息摘要 5(MD5) 校验码 | |
用指定的名称新建目录 | |
用指定的名称在 UNIX 中创建先进先出(FIFOs) 的 “命名管道” | |
用指定的名称创建设备结点;设备结点是一个特殊字符文件、特殊块文件或先进先出 | |
以安全方式新建临时文件;在脚本中使用 | |
移动或重命名文件或目录 | |
以更改后的调度优先级运行程序 | |
标记指定文件的行号 | |
以不能被挂起方式运行命令,输出重定向到一个日志文件 | |
输出进程可用的处理单元数目 | |
转换数字为人可读字符串或者相反 | |
以十进制或其他格式转储文件 | |
合并指定文件,用 tab 字符分隔,以行并列方式连续合并 | |
检查文件名是否可用 | |
轻量级的 finger 客户端;报告指定用户的信息 | |
对文件进行分页分行用于打印 | |
输出环境 | |
根据指定格式打印指定参数,类似于 C 语言的 printf 函数 | |
用文中的每个关键字,根据文件的内容中建立重排索引 | |
报告当前工作目录的名称 | |
报告指定符号链接的值 | |
打印解释后路径 | |
删除文件或目录 | |
如果目录为空则删除 | |
以指定安全上下文运行命令 | |
用指定的范围和增长步长输出一序列数字 | |
打印或检查 160-bit 安全哈希算法1(SHA1) 校验码 | |
打印或检查 224-bit 安全哈希算法校验码 | |
打印或检查 256-bit 安全哈希算法校验码 | |
打印或检查 384-bit 安全哈希算法校验码 | |
打印或检查 512-bit 安全哈希算法校验码 | |
用复杂形式多次重写指定文件,使得难以恢复其中的数据 | |
打乱文本行 | |
暂停指定时间 | |
排序给定文件的行 | |
根据大小或行数分割文件为多个块 | |
显示文件或文件系统状态 | |
用改变后的缓冲操作在标准流上运行命令 | |
设置或报告终端行设置 | |
打印指定文件的校验码和块数目 | |
清空文件系统缓存;强制更改块到磁盘并更新超级块 | |
反向输出给定文件 | |
输出每个给定文件的最后十行(或给定数目的行) | |
从标准输入读入并写出到标准输出和指定文件 | |
比较值并检查文件类型 | |
有限时间内运行命令 | |
更改文件时间戳,设置指定文件的访问和修改时间为当前时间; 如果文件不存在则创建空文件 | |
从标准输入转换、压缩并删除指定字符 | |
不做任何事情,总是成功;总是以表示成功的状态码退出 | |
压缩或扩展文件到特定大小 | |
进行拓扑排序;根据指定文件的部分排序写出完全有序列表 | |
报告链接到标准输入的终端文件名称 | |
报告系统信息 | |
转换空格为 tab 键 | |
忽略所有除非出现连续相同的行 | |
移除指定文件 | |
报告当前登录的用户名 | |
和 ls -l 相同 | |
报告给定文件的行数、单词数和字节数,以及给定多个文件时总的行数 | |
报告谁登录了 | |
报告和当前有效用户 ID 关联的用户名 | |
重复输出 “y” 或指定的字符串直到被杀死 | |
stdbuf 使用的库 |