管道 (I) 运算符的替代方案

管道 (I) 运算符的替代方案

我对此进行了研究,发现,但它没有回答我的问题。

我知道,语法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

这里有两个非常不同的概念,即使它们都可以用于向程序提供数据:

  1. 命令参数:这是程序启动时可用的字符串数组/列表,只需内存引用即可访问它们(以任何顺序)。但它们必须在程序启动前存在,并且它们的总大小是有限的(如果我没记错的话,大约 2MB)。在 shell 中,它们传递的方式如下:

    command arg1 arg2 arg3 ...
    
  2. 标准输入(又名标准输入): 这是一个输入流,可通过文件操作进行访问,并且必须按顺序读取(不能“随机访问”)。但其大小可能无限大,并且可以在读取它的程序运行时向其添加数据。有很多方法可以为程序提供 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

相关内容