Linux shell中的pipe道pipe理

我目前正在研究如何将stream水线pipe理到shell中。 例如,在我的shell中,如果我input“ls | wc | less”。 这个操作的结果将是创build三个进程,ls wc和less。 ls的输出将被input到wc的inputinput中,并且wc的输出将被input到input的input中。

对我来说,这意味着在执行“ls | wc | less”时。 less的标准input不是键盘,而是wc的输出。 但是,less一些仍然会响应我的键盘。 为什么? 我不明白,因为对我来说,由于它已经被pipe道,所以对键盘不太敏感。

有人有一个想法吗? 谢谢

代码从少

#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[27m\33[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