为什么在使用 bsdtar 提取存档时出现错误:“无法打开 '/dev/st0'”?

Gau*_*han 8 rhel tar

bsdtar从源代码(来自 libarchive 网站)安装,因为我rpmyum.

我能够看到bsdtar的帮助信息。例如:

$ bsdtar --help
First option must be a mode specifier:
  -c Create  -r Add/Replace  -t List  -u Update  -x Extract
Common Options:
...
bsdtar 3.1.2 - libarchive 3.1.2
Run Code Online (Sandbox Code Playgroud)

但是当我尝试提取文件时,出现以下错误:

$ bsdtar -xzC . < archive.tar.gz
bsdtar: Error opening archive: Failed to open '/dev/st0'
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个错误?

War*_*ung 11

x模式下,所有符合 POSIX 的版本都tar需要-f从默认值以外的其他地方读取输入存档。要从 中读取stdin,POSIX 还要求您提供-文件名:

$ tar -xf - < file.tar
Run Code Online (Sandbox Code Playgroud)

GNUtarbsdtar理解该语法。

GNUtar与 POSIX 的不同之处在于它接受一个没有明确参数的tar存档。事实上,POSIX 说没有,它根本不应该使用。从您的问题中可以清楚地看出,您是从 GNU用户那里获得命令行示例的。stdin -f --f -stdintar

bsdtar-f -如果您希望它从而stdin不是文件中读取,则遵循 POSIX要求。

这给我们带来了您的实际问题:当没有给出时-f -,为什么bsdtar选择读取/dev/st0?这就是我上面提到的默认值。POSIX 只说这个默认值是“依赖于系统的”;bsdtar选择使用第一个磁带驱动器dev 节点的名称,它恰好/dev/st0在 Linux 上。1

你需要这样说:

$ bsdtar -xf - < archive.tar.gz
Run Code Online (Sandbox Code Playgroud)

或者,完全跳过重定向:

$ bsdtar -xf archive.tar.gz
Run Code Online (Sandbox Code Playgroud)

我删除了,-z因为bsdtarGNU 和 GNUtar都会自动检测gzip压缩x模式。(旧版本的 GNUtar确实需要压缩类型标志,但在 2004 年发布的1.15 版中添加了自动检测。)

我还删除了该-C .位,因为它只是告诉bsdtar在解压缩存档之前更改到当前目录。这是一个空操作


  1. 为什么默认为第一个磁带机?因为tar是Tape ARchivertar来自一个时间的时候几乎每个Unix机器其实也有一个磁带驱动器。

  • 看来您实际上并不了解`bsdtar`,所以我不明白您为什么急于拥有它。似乎您正在从某个地方获取 GNU tar 命令并试图将其应用到 `bsdtar`,因此可能更好地转向另一个方向:为 OS X 获取 GNU tar,并将其设为默认值。我建议安装 [Homebrew](http://brew.sh),然后`brew install gnu-tar`,然后将 `alias tar=gtar` 添加到你的 `~/.bashrc`。 (2认同)