与进程替换的使用等效吗?

与进程替换的使用等效吗?

是否使用进程替换

command1 <(command2)

相当于

command2 > ~/myfile
command1 ~myfile

上面两个可以互相替换吗?

在命令替换的使用中command1和是否总是同时运行,而在“替换”中仅在运行完成后才运行?command2command1command2

如果是,这种差异是否使两者不等价并且在某些情况下并不总是相互替换?

谢谢。

答案1

这是流程替代

您给出的两种形式的最终结果应该基本相同;区别在于

  • 正如您所指出的,进程替换同时运行两个进程;
  • 您的第二种形式使用文件系统上的文件,因此您需要空间来存储该文件(理想情况下,之后将其删除)。

从技术上讲,涉及进程替换的进程之间的 I/O 的行为类似于管道,而不是文件。 (但这很可能是一个实现细节。)

正确编写的程序不应表现出差异结果因为它们同时运行;例如,

tail -n 1 <(seq 1 10000000)

正确显示序列中的最后一个数字,而尝试手动执行此操作

seq 1 10000000 > blah &
tail -n 1 blah

将失败,因为tail显示运行时存储的最后一行,它不会等待seq完成。在这种情况下,您的第二个表单正确等待。

然而,您可以看到外部的差异行为。例如,

head -n 1 <(seq 1 1000000000)

立即完成(甚至seq,由于管道行为),而

seq 1 1000000000 > blah
head -n 1 blah

需要相当长的时间才能运行。这种类型的差异可能意味着用一种形式替换另一种形式是不合适的。

相关内容