Shell POSIX';三通';指挥工作?

Shell POSIX';三通';指挥工作?,shell,posix,tee,Shell,Posix,Tee,tee newOutputFilenewOutputFile2 tee将如何准确地接受参数?会是这样吗 Tee将首先处理newOutputFilenewOutputFile2 因此,newOutputFile的内容将写入newOutputFile 2中 我正在尝试编写一个shell来处理这个特定命令。但是,我不知道将参数传递到tee的顺序。按照我编写程序的方式,它就可以了 tee newOutputFile2/dev/null或2>&1或类似内容),否则通常不会修改标准错误 如果愿意,您可以将0

tee newOutputFilenewOutputFile2

tee
将如何准确地接受参数?会是这样吗

  • Tee将首先处理
    newOutputFile
    因此,现有InputFile的内容将写入newOutputFile
  • newOutputFile>newOutputFile2
    因此,newOutputFile的内容将写入newOutputFile 2中
  • 我正在尝试编写一个shell来处理这个特定命令。但是,我不知道将参数传递到
    tee
    的顺序。按照我编写程序的方式,它就可以了


    tee newOutputFile2

    tee
    命令是一个常规的Unix程序,就像
    sh
    sort
    cat
    一样

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

    请特别注意,shell不参与现有输入文件的实际读取;它只是打开它进行读取,并将其连接到
    tee
    的标准输入,但不知道
    tee
    命令是否实际读取它。类似地,shell不参与实际写入
    newOutputFile2
    ;它只是打开并截断它(或创建它),并将它连接到
    tee
    的标准输出,但不知道
    tee
    命令是否真的写入了任何内容。在此上下文中,当
    tee
    命令正在运行时,父shell是完全被动的,不执行任何I/O操作

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


    我的印象是shell参与了文件的实际读写。因此,当我调用
    execvp
    时,它只接收命令(在本例中为
    tee
    )和将内容写入的最终文件(在本例中为
    newOutputFile2
    )。我正在尝试创建自己的shell程序,如何进行I/O重定向。这就是
    dup2
    发挥作用的地方吗

    shell只参与文件的打开和关闭,而不参与文件的读写。在命令行
    tee newOutputFilenewOutputFile2
    中,命令是
    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!
    
    这是因为
    open()。然后,通过归纳,您知道在关闭1之后,
    open()
    将在成功时返回1,在失败时返回-1(即使1之前已关闭)。除非命令行包含I/O重定向(如
    2>/dev/null
    2>&1
    或类似内容),否则通常不会修改标准错误

    如果愿意,您可以将0644写为:

    O_IRUSR|O_IWUSR|O_IRGRP|O_IROTH
    

    (如果要使用组和其他写入权限(0666),请添加
    | O|u IWGRP | O|u IWOTH
    ;权限将由
    umask
    修改)。就我个人而言,我觉得八进制更容易阅读,但在发明
    O_Ixyyy
    名称之前的几年,我就开始使用八进制权限。

    请参阅
    中的函数
    tee_files()
    http://git.savannah.gnu.org/cgit/coreutils.git/tree/src/tee.c
    我明白了。我的印象是shell参与了文件的实际读写。因此,当我调用execvp时,它只接收命令(在本例中为tee)和最后一个文件来写入内容(在本例中为newOutputFile2)。我正在尝试创建自己的shell程序,如何进行I/O重定向。这就是dup2发挥作用的地方吗?“事实上,特别是对于tee,输入通常是管道而不是文件,输出通常也是管道而不是文件。”因此命名为
    tee
    ,它是“t-pipe”上的一种文字游戏(命令通过管道传输数据,并点击它将数据写入文件;STDIN和STDOUT是t型管道的两端,目标文件是第三个)。
    O_IRUSR|O_IWUSR|O_IRGRP|O_IROTH