2015-06-21 66 views
-2

我有一个encrypt()功能是这样的:重定向VS管 - 为什么它的工作原理和为什么它不

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知道输出为管|是假设是用于加密函数输入(这样我没不需要指定“-i input.file”参数)

Q2为什么重定向在这种情况下起作用? echo“abc”> encrypt -a aes -k key -o output.file

回答

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 
+0

你能解释为什么echo“abc”>实际上并没有提供“abc”作为加密过程的输入。但仍然回显“abc”> file.txt将“abc”放入file.txt中。 – Noob

+0

@Noob'echo“abc”'将'abc \ n'写入'stdout'。因为您使用重定向操作符将'stdout'重定向到'file.txt',所以实际上是将'abc \ n'写入一个名为'file.txt'的文件中。通常,echo“X”> Y'会将'X \ n'写入文件'Y'。如果你使用'echo'abc“> encrypt ...',你可以将'abc \ n'写入一个名为'encrypt'的文件中。您不执行encrypt命令。 –

+0

当你说'echo abc |加密'你正在将输出传送到程序'encrypt'中。当你说'echo abc> encrypt'时,你将输出重定向到一个名为“encrypt”的文件中。 '|'操作符管道化为程序。 '>'操作符重定向到文件。你可能会有一个误解,那就是Unix/Linux中的命令名是特殊的 - 它们不是。当你说'echo abc> encrypt'时,shell不会**注意到“encrypt”也是一个命令的名字。它只是查找'>'后面的单词并通过该名称创建输出文件。 –

0

当你键入echo abc | encrypt ...,外壳读取整个字符串并解析它。它执行echo,其标准输入设置为当前shell的stdin,并将其stdout设置为新创建管道的写入结束。它还会复制encrypt,并将其stdin设置为该管道的读取端,并将其stdout设置为shell的stdout。 (请注意,分配echo的标准输入是无操作,实际上没有任何操作,因为该流只是从shell继承而来,它也被echo忽略,如果这样会造成混淆,请忽略此括号声明。)操作系统只有在每个进程的内部数据结构跟踪打开的文件描述符的意义上,才了解这些关联。换句话说,shell正在完成所有的工作。

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

+0

您好威廉姆斯,你是否能够解释为什么使用重定向不起作用? – Noob

+1

小挑逗:在大多数shell中 - 包含bash - echo是一个shell内建的,所以没有'echo'分支,尽管很多系统也有一个'echo'二进制文件,其工作原理类似(大概是为了使其他shell那里'回声'不是内置的,这是罕见的)。 –

+0

@ william-pursell我的意思是为什么echo“abc”>加密-a aes -k key -o output.file将不起作用 – Noob

相关问题