我如何知道 tar 是否真的将 XZ_OPT 传递给 xz ?

我如何知道 tar 是否真的将 XZ_OPT 传递给 xz ?

我在做什么:

XZ_OPT='-T0 -9 -vv' tar -vvcJf ~/backup.tar.xz ...FILES

我怀疑是否tar真的通过了给定的选项,我已经尝试过这些事情:

  1. 我用过-vv,但输出中XZ_OPT没有消息,也没有xz--verbose
  2. 我还用来ps aux | grep xz查看是否tar会有spawn另一个进程xz,但我没有看到tar创建任何进程。

问题

  1. 环境真的有用吗XZ_OPT?如何验证呢?
  2. 为什么执行过程中找不到xz进程tartar真的会产生压缩文件的进程吗?

环境

$ xz --version
xz (XZ Utils) 5.2.5
liblzma 5.2.5
$ tar --version
bsdtar 3.3.2 - libarchive 3.3.2 zlib/1.2.11 liblzma/5.0.5 bz2lib/1.0.6

答案1

  1. 环境真的有用吗XZ_OPT?如何验证呢?

向其传递无效的内容:

% XZ_OPT='--this-wont-work' tar -cJf foo.tar.xz foo
xz: unrecognized option '--this-wont-work'
xz: Try `xz --help' for more information.
tar: foo.tar.xz: Cannot write: Broken pipe
tar: Child returned status 1
tar: Error is not recoverable: exiting now
  1. xz为什么在 tar 执行过程中找不到进程?tar真的会产生压缩文件的进程吗?

从上面的输出来看,确实如此。您的存档是否需要足够长的时间来创建以使该过程持续?ps aux | grep xz两者都为我pgrep -fa xz展示了流程。xz


很可能tar不会显示它调用的程序的输出,除非它们失败。否则,他们可能会在输出中添加不受控制的噪声,而这并不是tar其本身所要求的。

答案2

在大多数 shell 中,您使用的语法将创建该环境变量并“导出”它。之后,除非 tar显式地将其从环境中删除,每个子程序都会看到它。

我确实看到它有一些效果。对比一下这个:

$ XZ_OPT='-T0 -9 -vv' tar -cJf junk.tar.xz ~/.config
tar: Removing leading `/' from member names
xz: Filter chain: --lzma2=dict=64MiB,lc=3,lp=0,pb=2,mode=normal,nice=64,mf=bt4,depth=0
xz: Using up to 4 threads.
xz: 4,997 MiB of memory is required. The limiter is disabled.
xz: Decompression will need 65 MiB of memory.
  100 %   2,541.8 KiB / 5,930.0 KiB = 0.429                   0:01

与此(我删除了-vv):

$ XZ_OPT='-T0 -9' tar -cJf junk.tar.xz ~/.config
tar: Removing leading `/' from member names

相关内容