是否使用进程替换
command1 <(command2)
相当于
command2 > ~/myfile
command1 ~myfile
?
上面两个可以互相替换吗?
在命令替换的使用中command1
和是否总是同时运行,而在“替换”中仅在运行完成后才运行?command2
command1
command2
如果是,这种差异是否使两者不等价并且在某些情况下并不总是相互替换?
谢谢。
答案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
需要相当长的时间才能运行。这种类型的差异可能意味着用一种形式替换另一种形式是不合适的。