【发布时间】:2019-01-03 11:48:18
【问题描述】:
[root@my-pc: ]# printf "" | xargs tar czf ./foo.tgz
tar: empty archive
[root@my-pc: ]# echo $?
123
[root@my-pc: ]#
tar 手册页仅记录返回代码 0、1 和 2,但进一步解释:
如果 tar 调用的子进程以非零值退出 退出代码,tar 本身也以该代码退出。这可能发生, 例如,如果使用了压缩选项(例如 -z)并且 外部压缩程序失败。另一个例子是rmt失败 在备份到远程设备期间。
所以我假设这个返回码“123”来自某个调用的子进程。
问题:tar 退出代码 123 是否总是意味着空存档? (什么子进程返回此代码?)
我的尝试:
1) 我唯一能想到的就是strace 这个,但我没有足够的经验来判断它的输出是否揭示了我的问题的答案。
[root@my-pc: ]# printf "" | xargs strace tar czf ./foo.tgz 2>&1 | grep -w 123
以上是在tar 上运行strace 的正确方法吗?无论如何,该命令没有输出。
如果相关,我可以在不包含最终 grep 的情况下包含上述输出,但我现在将其排除在外,因为它很长,而且我不清楚它是否一定有用
2) 搜索 SO,我找到的最接近的命中是 this,但我不确定这是否相关(我不清楚 find/xargs 涉及“@987654334 的返回码@")
【问题讨论】:
-
你需要
-f参数来跟踪子进程。 -
(是的,正如消息所暗示的那样,使用
-z会导致gzip运行。您仍然可以使用cf而不是czf获得退出状态吗?如果不是,这非常强烈暗示您应该将注意力集中在 gzip 上) -
顺便说一句,
xargs tar通常可能是个坏主意。如果您的文件名多于xargs可以放入单个tar命令的命令行参数列表中会怎样? (答案:它运行tar秒 次,并覆盖第一次调用写入的输出文件)。tar可以获取标准输入本身的文件列表;没有理由将它与xargs结合起来,也有充分的理由不这样做。
标签: linux tar return-code