gpt4 book ai didi

shell - POSIX 'tee' 命令如何工作?

转载 作者:行者123 更新时间:2023-12-05 00:25:52 25 4
gpt4 key购买 nike

tee newOutputFile < existingInputFile > newOutputFile2tee 究竟会怎样?接受论点?会是这样吗?

  • Tee 将首先处理 newOutputFile < existingInputFile所以existingInputFile的内容会被写入newOutputFile
  • newOutputFile > newOutputFile2所以 newOutputFile 的内容会被写入 newOutputFile 2

  • 我正在尝试编写一个处理这个特定命令的 shell。但是,我对将参数传递给 tee 的顺序感到困惑。 .我编写程序的方式可以做到
    tee newOutputFile2 < existingInputFIle

    最佳答案

    tee command 是一个普通的 Unix 程序,就像 shsortcat .

    处理 < existingInputFile 所涉及的所有 I/O 重定向工作和 > newOutputFile2tee 之前的 shell 完成命令被调用(在创建将执行 fork 命令的进程的 tee 之后)。该命令使用来自 existingInputFile 的标准输入调用。其标准输出为 newOutputFile2 .给 tee 的唯一参数是 argv[0] (字符串 tee )和 argv[1] (字符串 newOutputFile ),加上一个空指针来标记参数列表的结尾。

    请特别注意,existingInputFile 的实际读取不涉及 shell。 ;它只是打开它进行读取并将其连接到 tee 的标准输入, 但不知道 tee命令实际上是否读取它。同样,shell 不参与到 newOutputFile2 的实际写入中。 ;它只是打开并截断它(或创建它)并将其连接到 tee 的标准输出, 但不知道 tee command 实际上向它写入任何内容。在这种情况下,而 tee命令正在运行,父 shell 是完全被动的,不执行 I/O。

    根据设计,tee读取其标准输入并将所有内容的一份副本写入其参数列表中给定的每个文件,然后再将一份副本写入标准输出。

    I was under the impression that the shell was involved in the actual reading and writing of the files. So when I call execvp, it only takes in the command (in this case tee) and the final file to write the contents to (in this case newOutputFile2). I am trying to create my own shell program, how would I do the I/O redirection. Is this where dup2 comes into play?



    shell只参与文件的打开和关闭,不参与文件的读写。在你的命令行 tee newOutputFile < existingInputFile > newOutputFile2 ,命令为 tee唯一的其他参数是 newOutputFile .通常,命令(在这种情况下为 tee)不知道为其提供标准输入的文件的名称,也不知道它在其标准输出上写入的文件的名称。确实,尤其是 tee ,输入通常是管道而不是文件,并且输出通常也是管道而不是文件:
    some_command arg1 arg2 | tee some_command.log | another_command its_arg1 its_arg2 > output.file

    在您自己的 shell 程序中,您可以使用 dup2()复制您单独打开的文件描述符,使其成为标准输入:
    // Redirect standard input from existingInputFile using dup2()
    char *i_filename = "existingInputFile";
    int fd = open(i_filename, O_RDONLY);
    if (fd < 0)
    {
    fprintf(stderr, "unable to open file %s for reading (%d: %s)\n",
    i_filename, errno, strerror(errno));
    exit(1);
    }
    dup2(fd, STDIN_FILENO);
    close(fd); // Crucial!

    请注意,关闭 fd 很重要。在这种情况下。否则,该命令将在至少打开一个未在命令行中指定的额外文件描述符的情况下运行。对于标准输出重定向,您会有类似的代码块。

    或者你可以使用:
    // Redirect standard input from existingInputFile
    close(0);
    char *i_filename = "existingInputFile";
    int fd = open(i_filename, O_RDONLY);
    if (fd < 0)
    {
    fprintf(stderr, "unable to open file %s for reading (%d: %s)\n",
    i_filename, errno, strerror(errno));
    exit(1);
    }
    assert(fd == 0);

    // Redirect standard output to NewOutputFile2
    close(1);
    char * o_filename = "newOutputFile2";
    fd = open(o_filename, O_WRONLY|O_CREAT|O_TRUNC, 0644); // Classically 0666
    if (fd < 0)
    {
    fprintf(stderr, "unable to open file %s for writing (%d: %s)\n",
    o_filename, errno, strerror(errno));
    exit(1);
    }
    assert(fd == 1);

    这是因为 open()返回先前未打开的最低可用文件描述符,因此通过关闭 0,您知道 open()成功时返回 0,失败时返回 -1(即使 0 之前已关闭)。然后,通过归纳,你知道在关闭 1 之后, open()成功时返回 1,失败时返回 -1(即使 1 之前已关闭)。除非命令行包含 I/O 重定向,例如 2>/dev/null,否则您通常不会修改标准错误。或 2>&1或类似的东西。

    如果您愿意,可以将 0644 写为:
    O_IRUSR|O_IWUSR|O_IRGRP|O_IROTH

    (如果您想使用组和其他写入权限(0666),请添加 |O_IWGRP|O_IWOTH;无论如何,权限将由 umask 修改)。就个人而言,我发现八进制更容易阅读,但我在 O_Ixyyy 之前几年就开始使用八进制权限。名字被发明了。

    关于shell - POSIX 'tee' 命令如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23448043/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com