我有 Unix 编程环境书的第一版。在第 2 章中,作者声明目录作为文件是可读的,并提到了有关这些文件格式的一些事实。他们给出了一些使用示例,例如cat .
(在练习 2-2 中)。
至少在 Darwin 中,目录不再作为文件可读。至少,它们在读取时看起来是零长度文件。
这个变化是什么时候发生的,有没有关于它的官方文档?
以下 bash 命令进入无限循环:
$ echo hi > x
$ cat x >> x
Run Code Online (Sandbox Code Playgroud)
我可以猜测它在开始写入标准输出后会cat
继续读取x
。然而,令人困惑的是,我自己的 cat 测试实现表现出不同的行为:
// mycat.c
#include <stdio.h>
int main(int argc, char **argv) {
FILE *f = fopen(argv[1], "rb");
char buf[4096];
int num_read;
while ((num_read = fread(buf, 1, 4096, f))) {
fwrite(buf, 1, num_read, stdout);
fflush(stdout);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果我运行:
$ make mycat
$ echo hi > x
$ ./mycat x >> x
Run Code Online (Sandbox Code Playgroud)
它不是循环。鉴于在再次调用之前cat
我正在刷新的行为和事实,我希望这个 C 代码能够在一个循环中继续读取和写入。stdout
fread
这两种行为如何一致?什么机制解释了为什么 …
以下命令似乎大致等效:
read varname
varname=$(head -1)
varname=$(sed 1q)
Run Code Online (Sandbox Code Playgroud)
一个区别是,read
是内置,而壳head
和sed
都没有。
除此之外,三者在行为上有什么不同吗?
我的动机是更好地理解 shell 和关键实用程序(如head,sed
. 例如,如果 usinghead
是 的简单替代品read
,那么为什么它read
作为内置函数存在?