【问题标题】:unzipping bzip file using bash使用 bash 解压缩 bzip 文件
【发布时间】:2017-05-01 16:43:55
【问题描述】:

我正在尝试以这种方式使用 bash 解压缩 bzip 文件

tmp1 = #(bzcat all.tbz)
echo tmp1 | tar x

但这失败了

tar: Unrecognized archive format
tar: Error exit delayed from previous errors.

但如果我这样做

bzcat all.tbz | tar x

这行得通

我之前的方法有什么问题。

谢谢!

【问题讨论】:

  • # 是评论字符。为什么在(bzcat all.tbz) 之前使用它?
  • 你似乎对基本的shell语法有几个误解。在作业中,= 周围不能有空格。在变量之前需要$。要执行命令并返回输出,请使用$(command),而不是#(command)
  • 并且由于bzcat的输出包含空格,你应该引用变量。
  • 另外,bzip 文件的内容包含二进制信息,其中可能包含空字节。 Bash 变量中不能有 null,所以这不起作用。[
  • 同意,开始将任意二进制数据存储在 bag 变量中通常是个坏主意。而且你无论如何也不想要它。 Bzip2 是我认为的块压缩算法。你希望压缩数据的蒸汽在运行中被解压缩,当内容变得太大时,你最终会耗尽内存。在不存储到变量的情况下通过管道输入文件更有意义。

标签: bash bzip2 bzip


【解决方案1】:

你有很多语法错误。

tmp1=$(bzcat all.tbz)
echo "$tmp1" | tar x
  1. 作业不能在= 周围有空格。
  2. 使用$(...) 执行命令并替换其输出。
  3. 回显时将$ 放在变量名之前。
  4. " 放在变量周围,以防止结果的分词和通配符扩展。

但这很可能仍然行不通,因为 tar 文件包含空字节,而 bash 变量不能容纳这个字符(它是 C 字符串终止符)。

如果您只想在失败时捕获错误消息,您可以这样做:

tmp1=$((bzcat all.tbz | tar x) 2>&1)
if [ ! -z "$tmp1" ]
then echo "$tmp1"
fi

Bash script - store stderr in a variable

【讨论】:

  • 没有理由 c 数据中不能包含空字节,但显然在这种情况下,您不再将其视为字符串。在 bash 中没有优雅的方法可以做到这一点,因此您通常会将此类二进制数据保存在管道或文件中。如果您可以设法在程序的每个终止路径(bash 中的 PITA)中清理临时文件,那么临时文件也适用于此
  • @DanFarrell 但是 bash 将变量视为 C 字符串,而不是任意数据,因此它们不能有空值。
  • 基本上我想在 bzcat 失败时捕获错误并返回。有什么办法可以做到吗?
  • @AbdulRahman 错误消息转到stderr,您只是在捕获stdout
  • 它测试$tmp 是否不为空。这是基本的 shell 脚本。
猜你喜欢
  • 2011-06-14
  • 2012-09-01
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多