Linux shell 中的流水线管理



我目前正在研究如何将流水线管理成 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

相关内容

  • 没有找到相关文章

最新更新