我对此进行了研究,发现这,但它没有回答我的问题。
我知道,语法expression1 | expression2
意味着取表达式1的结果并将其输入到表达式2。
expression2
expression1
现在,从语义上讲,它应该与只获取表达式 1 的结果并将其明确地作为参数提供给表达式 2相同。然而,这并不奏效。
在编程中,如果你有print(2+4)
,首先2+4
计算,然后打印。这里的概念似乎相同..但事实并非如此。似乎我不太清楚这一点。任何对此的良好澄清都将不胜感激。
答案1
结果和输出是不同的概念。正如争论和输入。
command1 | command2
采取输出command1 并将其提供给输入命令2。
command2 command1
使用一个参数(字符串“command1”)运行 command2。这绝对不是一回事。
管道可以替换为流程替代和重定向不过。你想象的可能是这样的:
command2 < <(command1)
<
意思是“从这里读取输入”,<(...)
运行所附的命令并创建一个可以读取的“文件名”。
答案2
这里有两个非常不同的概念,即使它们都可以用于向程序提供数据:
命令参数:这是程序启动时可用的字符串数组/列表,只需内存引用即可访问它们(以任何顺序)。但它们必须在程序启动前存在,并且它们的总大小是有限的(如果我没记错的话,大约 2MB)。在 shell 中,它们传递的方式如下:
command arg1 arg2 arg3 ...
标准输入(又名标准输入): 这是一个输入流,可通过文件操作进行访问,并且必须按顺序读取(不能“随机访问”)。但其大小可能无限大,并且可以在读取它的程序运行时向其添加数据。有很多方法可以为程序提供 stdin,最常见的两种是:
- 从文件读取:
command < file
- 使用另一个程序的输出:
command1 | command2
- 从文件读取:
这两种方法可以共存,参数通常用于告诉如何处理(例如,排序参数),而 stdin 则用于输入要处理的内容(要排序的数据)。
正是 shell 为程序提供了参数,因此参数必须以字符串的形式存在于 shell 数据中。相比之下,对于 stdin,shell 只是处理文件句柄,而看不到数据。
在 shell 中,通常有一种方法可以将某些命令的输出转换为 shell 的单个字符串,在 bash 中使用以下$(...)
语法:
string_variable=$(command1 arg1 arg2)
您还会看到反引号,但这已被弃用:
string_variable=`command1 arg1 arg2`
因此,您可以将一个命令的输出作为参数传递给另一个命令:
string_variable=$(command1 arg1 arg2)
command2 $string_variable
但你也可以跳过中间变量并使用更直接的方法:
command2 $(command1 arg1 arg2)
最后说明:command1|command2
两个命令并行运行(如果传输了足够的数据)并相互协调,而在 中command2 $(command1)
,在被调用command1
之前终止。command2