Overview
在 Linux 中,<()
是一种被称为进程替换(Process Substitution)的特性。它允许你将一个或多个子进程的输出作为另一个命令的参数。这种方法使你能够在不需要创建临时文件的情况下,将多个命令的输出直接作为其他命令的输入。这对于组合多个命令以及处理复杂的管道命令非常有用。
基本语法
command <(sub_command)
这里,sub_command 的输出会被模拟为一个可读的临时文件,然后作为 command 的输入参数。
使用场景与代码示例
比较两个命令的输出
如果你想比较两个文件夹中的文件列表,通常你可能需要先列出每个文件夹中的文件并将它们重定向到两个临时文件中,然后使用 diff
比较这两个文件。使用进程替换,你可以直接完成这一切:
diff <(ls folder1) <(ls folder2)
对两个数据库表导出的数据进行比较
假设你有两个数据库表,你想比较它们导出的数据:
diff <(mysqldump -u user -p database table1) <(mysqldump -u user -p database table2)
将多个文件的内容传递给循环
如果你想在一个循环中处理几个文件的内容,可以使用进程替换来实现:
while read line; do
echo "处理: $line"
done < <(cat file1 file2 file3)
结合 tee 命令打印标准输出并将输出传给多个命令
tee >(command1) >(command2) | command3
例如,同时将 ls 命令的输出保存到两个不同的文件中:
ls | tee >(grep pattern > matches.txt) >(grep -v pattern > nonmatches.txt)
这里,ls
命令的输出会同时被传递给两个 grep
命令,一个用于筛选匹配特定模式的行,另一个用于筛选不匹配的行。
用tar打包时直接压缩
假设你想备份一个目录,通常你可能会先使用 tar
将目录打包成文件,然后再压缩该文件。使用进程替换,你可以直接完成这一步:
tar czf >(gzip > backup.tar.gz) /path/to/directory
注意事项:
-
并不是所有的
shell
都支持进程替换。比如,最原始的sh
就不支持,而bash
和zsh
等较新的shell
支持这个功能。 -
进程替换对于处理临时需要结合多种命令输出的复杂情况非常有用,但也应谨慎使用,特别是在脚本中,因为它可能会影响脚本的移植性和可读性。