我目前正在研究如何将流水线管理成 shell。例如,在我的外壳中,如果我输入"ls |厕所 |少"。此操作的结果将是创建三个进程,ls wc 和更少。ls 的输出将通过管道传输到 wc 的输入,wc 的输出将通过管道传输到 less 的输入输入。
对我来说,这意味着在执行"ls |厕所 |少"。less的标准输入将不是键盘,而是wc的输出。但是,更少的人仍然会对我的键盘做出响应。为什么?我不明白,因为对我来说,自从键盘被管道传输以来,更少不应该对键盘敏感。
有人有想法吗?谢谢
来自 less
的代码#if HAVE_DUP
/*
* Force standard input to be the user's terminal
* (the normal standard input), even if less's standard input
* is coming from a pipe.
*/
inp = dup(0);
close(0);
#if OS2
/* The __open() system call translates "/dev/tty" to "con". */
if (__open("/dev/tty", OPEN_READ) < 0)
#else
if (open("/dev/tty", OPEN_READ) < 0)
#endif
dup(inp);
#endif
它打开来自/dev/tty 的直接流以及您的 stdin 是什么。
只是一个猜测 - 为交互式会话打开/dev/console
较少,我曾经使用过这个技巧。我错了 - strace
是你的朋友:-):
echo | strace less
) = 16
read(0, "n", 8192) = 1
write(1, "n", 1
) = 1
read(0, "", 8191) = 0
write(1, "33[7m(END)33[27m33[K", 17(END)) = 17
read(3,
如您所见,从FD 3中读取的内容较少。
/* Standard file descriptors. */
#define STDIN_FILENO 0 /* Standard input. */
#define STDOUT_FILENO 1 /* Standard output. */
#define STDERR_FILENO 2 /* Standard error output. */
仔细观察(在"q"之后)显示:
open("/dev/tty", O_RDONLY) = 3
这确认了@123的源代码检查-它打开了/dev/tty
。