【问题标题】:Does tar exit code 123 always mean empty archive?tar 退出代码 123 是否总是意味着空存档?
【发布时间】: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 手册页仅记录返回代码 012,但进一步解释:

如果 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


【解决方案1】:

来自man xargs

EXIT STATUS
       xargs exits with the following status:
       0 if it succeeds
       123 if any invocation of the command exited with status 1-125
       124 if the command exited with status 255
       125 if the command is killed by a signal
       126 if the command cannot be run
       127 if the command is not found
       1 if some other error occurred.

因此,任何来自tar 的非零退出状态将导致xargs tar 使用状态123

【讨论】:

    猜你喜欢
    • 2018-01-07
    • 2018-06-14
    • 1970-01-01
    • 2018-11-13
    • 1970-01-01
    • 2022-10-04
    • 2022-09-23
    • 2011-04-26
    • 2021-10-01
    相关资源
    最近更新 更多