提取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)
这个会起作用。