我们有这个 GNU tar 命令,如下所示:
$ tar -xjf /dev/st0 --to-command='sh -c '\''printf "%s\n" "$TAR_SIZE $TAR_REALNAME" >> "$TAR_ARCHIVE.sizes.txt"'\'
有什么方法可以获取tar
内部的 PID吗--to-command
?例如:
$ [...] --to-command='sh -c '\''printf "%s\n" "$TAR_SIZE $TAR_REALNAME" >> "$TAR_ARCHIVE.sizes. $TAR_PID .txt"'\'
$TAR_PID
(请注意结尾处添加的虚构内容)
我阅读了 GNU tar 1.34 的手册页,但没有看到相关变量。
所有POSIX
sh
实现都将$PPID
变量设置为执行它的进程的父进程的 pid,因此:请注意,该变量不会显示在输出中,
printenv
因为它未导出到环境中(可以理解,因为其值仅对当前 shell 有效),请使用命令set
而不是命令列出所有 shell 变量(其中包括通过排除无法映射到 shell 变量的环境变量而printenv
报告的变量的子集)。printenv
如果由于某种原因您
sh
没有设置$PPID
变量,您可以随时执行以下操作:其中,由于
exec
,它是运行的同一个进程sh
,然后tar
,因此我们可以在环境变量中提供其pid($$
)TAR_PID
。现在,由于
$TAR_ARCHIVE
和$TAR_PID
没有变化,没有必要为每个文件重新打开文件,并且您可以一次重定向所有输出并使用>
而不是>>
:您还可以使用标准
pax
命令获取大小和名称信息。尽管根据我的经验,GNU/Linux 系统上常见的实现并未实现该
listopt
选项。我的 Arch Linux 系统上的 GNU Tar 1.35 在 shell 中运行该命令,因此这会为我输出 tar 的 PID:
例子:
因此也许这应该可行:
测试一下: