等同于使用过程替换?

Tim*_*Tim 0 bash process-substitution

是进程替换的用法

command1 <(command2)
Run Code Online (Sandbox Code Playgroud)

相当于

command2 > ~/myfile
command1 ~myfile
Run Code Online (Sandbox Code Playgroud)

?

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

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

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

谢谢。

Ste*_*itt 7

这是过程替换

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

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

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

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

tail -n 1 <(seq 1 10000000)
Run Code Online (Sandbox Code Playgroud)

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

seq 1 10000000 > blah &
tail -n 1 blah
Run Code Online (Sandbox Code Playgroud)

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

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

head -n 1 <(seq 1 1000000000)
Run Code Online (Sandbox Code Playgroud)

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

seq 1 1000000000 > blah
head -n 1 blah
Run Code Online (Sandbox Code Playgroud)

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