重定向与管道 - 它为何起作用以及它为什么不起作用

时间:2015-06-21 08:20:01

标签: linux unix centos pipe redhat

我有一个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()函数如何知道或操作系统知道管道|的输出被认为是加密函数的输入(所以我没有需要指定“-i input.file”参数)

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

当您键入echo abc | encrypt ...时,shell会读取整个字符串并对其进行解析。它执行echo,其stdin设置为当前shell的stdin,其stdout设置为新创建的管道的写入端。它还会分配encrypt的副本并将其stdin设置为该管道的读取端,并将其stdout设置为shell的stdout。 (请注意,分配echo的标准输入是一个无操作,实际上没有任何操作,因为流只是从shell继承。echo也会忽略它,如果这是令人困惑的请忽略这个括号语句。)操作系统只知道每个进程的内部数据结构跟踪打开的文件描述符的意义上的这些关联。换句话说,shell正在完成所有工作。

解决第二个问题:&#34;为什么在这种情况下重定向会起作用[原文如此]?&#34;,我想知道你说它起作用时的意思。 echo "abc" > encrypt -a aes -k key -o output.fileecho abc -a aes -k key -o output.file > encrypt完全相同,因此可以期望将echo的输出写入名为encrypt的文件,但不执行encrypt命令。