我试图使用进程替换并遇到以下示例:
exec 3>&1
tar cf /dev/fd/4 $directory_name 4>&1 >&3 3>&- | bzip2 -c > file.tar.bz2 3>&-
exec 3>&-
根据我的理解,这意味着以下内容:
创建文件描述符
3
并将其附加到标准输出。tar
将压缩由定义的目录中的文件,压缩文件在$directory_name
内部由文件描述符表示4
。文件描述符
4
附加到标准输出。stdout 附加到文件描述符
3
和文件描述符3
关闭。
但是再次在bzip2
文件描述符中再次关闭并且在最后一行exec
命令中也关闭描述符3
。我迷路了,为什么同一个文件描述符被关闭了 3 次?
这些是不同的描述符。看到这个很好的答案。它说:
在这种情况下,
tar cf /dev/fd/4 $directory_name 4>&1 >&3 3>&-
重定向甚至在启动之前就由 shell 处理tar
,但原理是相同的:这些描述符不是主 shell 的描述符。启动时tar
(严格来说:当 shell 的副本最终执行到时tar
),它的/dev/fd/*
链接已经准备好并且没有/dev/fd/3
.以同样的方式
bzip2
找到自己准备的描述符。它们可能与某些其他进程的描述符链接到相同的文件,但它们是独立的实体。请记住每个进程在 中看到它自己的描述符
/dev/fd/
,这是一个有用的技巧。如果考虑/proc/<PID>/fd/
目录,每个 PID 的描述符将变得更加清晰。最后
exec 3>&-
关闭主 shell 的描述符。它是另一个独立的实体。