ar 输入管

ar 输入管

提取deb文件时,简单的curl管道ar无法正常工作。我试过

curl http://example.com/path/to/package.deb | ar -xv -

curl http://example.com/path/to/package.deb | ar -xv

查看man 1 ar,我找不到任何指向管道用法的指针。是否ar支持输入管道?

谢谢!

答案1

是否ar支持输入管道?

不。它似乎ar需要其输入可寻址,它无法从 fifo 读取。至少在我的 Debian 9 中是这样。

首先,该工具无法识别-为 stdin。此命令

ar -xv -

返回ar: -: No such file or directory。省略操作数也不会使工具使用其标准输入。

有一种技巧可以强制任何工具(需要文件)使用其标准输入:(/proc/self/fd/0其他可能性:/dev/fd/0/dev/stdin)。例如,您可以将输出流保存为whatever稀疏文件,即使whatever对稀疏文件一无所知;cp尽管它通常不读取其标准输入,您仍可以使用:

whatever | cp --sparse=always /proc/self/fd/0 output_file

你可以尝试这个技巧ar

curl http://example.com/path/to/package.deb | ar -xv /proc/self/fd/0

但你会得到ar: /proc/self/fd/0: Illegal seek。在我的 Debian 中strace,该工具使用lseek(2)负偏移量。这对于管道失败。

以我有限的知识,我没有发现任何明显的原因(这里) 必然寻求。即使理论上人们可以解析 ar 档案而不需要寻求和返回,但显然在实践中确实ar需要寻求。

进程替换还会创建一个不可查找的 fifo。这将以同样的方式失败:

ar -xv <(curl http://example.com/path/to/package.deb)

我认为除了先创建一个(临时)可搜索文件之外没有其他方法。通常,您可以明确地执行此操作:

tmpf="$(mktemp)" && {
  curl http://example.com/path/to/package.deb > "$tmpf" && ar -xv -- "$tmpf"
  rm -- "$tmpf"
}

还有zsh另一种形式的进程替换,可以隐式创建和管理临时文件:

# in zsh
ar -xv =(curl http://example.com/path/to/package.deb)

这个会起作用。

相关内容