重定向 vs 管道——为什么有效,为什么无效

redirection vs pipe - why it works and why it doesn't

我有一个 encrypt() 函数是这样的:

encrypt -a aes -k key **-i input.file** -o output.file

它接收 1 个输入文件并输出 1 个文件。

通过使用管道:

echo "abc" | encrypt -a aes -k key -o output.file

Q1) encrypt() 函数或 OS 如何知道管道 | 的输出假设是加密函数 [=25= 的输入](这样我就不需要指定“-i input.file”参数) ?

Q2 为什么重定向在这种情况下有效? echo "abc" > encrypt -a aes -k key -o output.file

使用管道时,不涉及常规文件。当你调用

echo "abc" | encrypt -a aes -k key -o output.file

encrypt 程序根本不打开文件,而是读取其 标准输入 。标准输入是您调用它时在命令行上设置的任何内容。标准输入可以是管道,如您的示例所示。如果使用输入重定向,标准输入可以是一个文件:

encrypt -a aes -k key -o output.file < otherinput.file

最后,如果您根本不使用任何管道或输入重定向,也就是说,如果您调用

encrypt -a aes -k key -o output.file

然后 encrypt 程序将从键盘读取。

不过你的第二个问题Q2没有意义。您最终将创建一个名为 "encrypt" 的输出文件,而您根本不会 运行 encrypt 程序。如果你想使用输出重定向来控制 encrypt 程序输出的位置,你可以使用

encrypt -a aes -k key -i input.file > output.file

echo "abc" | encrypt -a aes -k key > output.file

当您键入 echo abc | encrypt ... 时,shell 会读取整个字符串并对其进行解析。它执行 echo,其标准输入设置为当前 shell 的标准输入,其标准输出设置为新创建管道的写入端。它还派生了 encrypt 的一个副本,并将其标准输入设置为该管道的读取端,并将其标准输出设置为 shell 的标准输出。 (请注意,分配 echo 的标准输入是空操作,实际上什么也没做,因为流只是从 shell 继承而来。echo 也会忽略它,如果这令人困惑,请忽略这个附加声明。)OS 仅在每个进程的内部数据结构跟踪打开的文件描述符的意义上了解这些关联。换句话说,shell 完成了所有工作。

解决第二个问题:"Why does redirection works[sic] in this case?",我想知道你说它有效是什么意思。 echo "abc" > encrypt -a aes -k key -o output.fileecho abc -a aes -k key -o output.file > encrypt 完全等价,因此人们希望将 echo 的输出写入名为 encrypt 的文件,但 encrypt 命令未执行。