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
将如何准确地接受参数?会是这样吗
newOutputFile
因此,现有InputFile的内容将写入newOutputFilenewOutputFile>newOutputFile2
因此,newOutputFile的内容将写入newOutputFile 2中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