下面的 shell 重定向如何工作? 执行顺序似乎很难理解。 有什么简单的解释吗?
uuencode host-file < host-file >encodedfile
答案1
uuencode
是命令。host-file
是它的参数。< host-file
将文件重定向到命令的标准输入。>encodedfile
将命令的输出重定向到文件。
答案2
当启动控制台程序时,它会打开三个标准文件描述符:
0 标准输入
1 标准输出
2 标准错误
通常,STDIN 文件句柄从终端输入(即键盘)读取。但是,当<
使用重定向时,输入将从该文件读取。同样,STDOUT 通常写入终端,但是当>
使用时,输出将写入该文件。
类似地,可以使用 重定向 STDERR 2>
。您可能还会看到使用 将 STDERR 重定向到与 STDOUT 相同的位置2>&1
。
答案3
uuencode host-file < host-file >encodedfile
我们将其分为 4 个部分:
uuencode
是要运行的命令的名称。shell 搜索 PATH 环境变量 ($PATH) 并uuencode
在 PATH 中的每个目录中查找可执行文件。在标准安装中,该文件为/usr/bin/uuencode
。uuencode 程序获取二进制文件并将其转换为特殊格式的文本,以便可以通过无法处理非 ASCII 字符的网络发送。- 第一个
host-file
是命令行参数uuencode
。该uuencode
命令需要一个参数,以便它可以将文件的名称放入编码版本中。编码文件的第一行将如下所示:begin 644 host-file
< host-file
shell 使用名为host-file
标准输入 (stdin) 的文件来处理进程uuencode
。因此,当uuencode
读取一些输入字节时,它们不是来自键盘,而是来自该文件。>encodefile
encodedfile
是使用名为标准输出 (stdout) 的文件的 shell 。因此,当uuencode
写入某些输出时,它不会转到屏幕上,而是转到该文件。
实际上,执行顺序并不存在,因为只uuencode
执行了一个命令。如果您想要技术细节,请继续阅读。
在后台,shell 调用fork()
,然后子进程打开host-file
文件进行读取,打开encodedfile
文件进行写入,然后调用exec()
,这会将子进程(shell 进程的副本)替换为 进程uuencode
。然后子进程变为uuencode
,输入文件描述符(操作系统跟踪打开文件的方式)设置为host-file
,输出文件描述符设置为encodedfile
。