【问题标题】:redirection vs pipe - why it works and why it doesn't重定向与管道 - 为什么它有效,为什么它不
【发布时间】:2015-09-06 21:04:24
【问题描述】:

我有一个像这样的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

【问题讨论】:

    标签: linux unix centos pipe redhat


    【解决方案1】:

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

    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" > 实际上没有提供 "abc" 作为加密过程的输入。但是 echo "abc" > file.txt 正在将 "abc" 放入 file.txt。
    • @Noob echo "abc"abc\n 写入stdout。因为您使用重定向运算符将stdout 重定向到file.txt,所以您实际上是将abc\n 写入名为file.txt 的文件中。通常,echo "X" &gt;Y 会将X\n 写入文件Y。如果您执行echo "abc" &gt; encrypt ...,则将abc\n 写入名为encrypt 的文件中。您不执行加密命令。
    • 当您说echo abc | encrypt 时,您正在将输出通过管道传输到程序encrypt。当您说echo abc &gt; encrypt 时,您将输出重定向到一个名为“encrypt”的文件中。 | 操作符通过管道进入程序。 &gt; 运算符重定向到文件。您可能存在的一个误解是命令名称在 Unix/Linux 中是特殊的——它们不是。当您说echo abc &gt; encrypt 时,shell 确实注意到“加密”也是命令的名称。它只是在&gt; 之后查找单词并使用该名称创建一个输出文件。
    • @SteveSummit 感谢您的解释。但是,如果您的意思是 > 运算符重定向到文件中。 encrypt -a aes -k key -o output.file encrypt -a aes -k key -o output.file 有什么区别。两者都使用重定向..你的意思是 > 总是意味着重定向到文件,而 ,要么从文件输入
    • @Noob:是的,&gt; 总是将输出重定向到文件,&lt; 总是将输入重定向到文件。你为什么一直写echo "abc" &gt; encrypt -a aes -k key -o output.file,你认为它应该做什么?听起来您认为echo "abc" &gt; encryptecho "abc" | encrypt 应该做同样的事情,但这没有意义,因为&gt;| 是完全不同的运算符。
    【解决方案2】:

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

    解决第二个问题:“为什么在这种情况下重定向有效[原文如此]?”,我想知道您说它有效是什么意思。 echo "abc" &gt; encrypt -a aes -k key -o output.fileecho abc -a aes -k key -o output.file &gt; encrypt 完全等价,因此可以预期 echo 的输出将写入名为 encrypt 的文件,但不会执行 encrypt 命令。

    【讨论】:

    • 嗨,威廉,你能解释一下为什么使用重定向不起作用吗?
    • Small nitpick:在大多数 shell 中——包括 bash——echo 是一个内置的 shell,所以没有 echo 的分支,尽管许多系统也有一个类似工作的 echo 二进制文件(大概让其他没有内置 echo 的 shell 更容易,这无论如何都很少见)。
    • @william-pursell 我真正的意思是为什么 echo "abc" > encrypt -a aes -k key -o output.file 不起作用
    • @Noob,它不起作用,因为您将 echo abc -a aes -k key -o output.file 的输出重定向到名为 encrypt 的文件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-11
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    相关资源
    最近更新 更多