您可以通过手动执行管道操作来重现外壳在引擎盖下的功能。如果您的系统有条目,则可以使用文件描述符改组:您可以翻译/dev/fd/NNN
main_command <(produce_arg1) <(produce_arg2) >(consume_arg3) >(consume_arg4)
至
{ produce_arg1 |
{ produce_arg2 |
{ main_command /dev/fd5 /dev/fd6 /dev/fd3 /dev/fd4 </dev/fd/8 >/dev/fd/9; } 5<&0 3>&1 |
consume_arg3; } 6<&0 4>&1; |
consume_arg4; } 8<&0 9>&1
我展示了一个更复杂的示例来说明多个输入和输出。如果您不需要读取标准输入,并且使用进程替换的唯一原因是该命令需要一个明确的文件名,则可以使用/dev/stdin
:
main_command <(produce_arg1)
produce_arg1 | main_command /dev/stdin
如果没有,则需要使用命名管道。命名管道是目录条目,因此您需要在某个地方创建一个临时文件,但是该文件只是一个名称,它不包含任何数据。/dev/fd/NNN
tmp=$(mktemp -d)
mkfifo "$tmp/f1" "$tmp/f2" "$tmp/f3" "$tmp/f4"
produce_arg1 >"$tmp/f1" &
produce_arg2 >"$tmp/f2" &
consume_arg3 <"$tmp/f3" &
consume_arg4 <"$tmp/f4" &
main_command "$tmp/f1" "$tmp/f2" "$tmp/f3" "$tmp/f4"
rm -r "$tmp"