我正在尝试将 tar/gzip 存档导入 tar 以对其进行解压缩。我拥有的脚本是自解压安装程序的一部分,其中我的存档附加到脚本中。这在 Linux 上运行良好,脚本如下所示:
export TMPDIR=`mktemp -d /tmp/selfextract.XXXXXX`
echo "TEMP: $TMPDIR"
ARCHIVE=`awk '/^__ARCHIVE_BELOW__/ {print NR + 1; exit 0; }' $0`
tail -n+$ARCHIVE $0 | tar xz -C $TMPDIR
exit 0
__ARCHIVE_BELOW__
tar 存档以字符串形式位于存档如下但由于它太大了,所以我在这里将其省略。
但是,当我在 FreeBSD 上执行此操作时,出现以下错误:
tar: Failed to open '/dev/sa0'
我读到这是因为免费 BSD 默认希望从该设备读取,并且您可以通过-f -
如下方式告诉它从 stdin 读取:
tail -n+$ARCHIVE $0 | tar zxf - -C $TMPDIR
但是,当我这样做时,我只收到错误:
tar: Damaged tar archive
tar: Retrying...
有人能指出我在这里做错了什么吗?出于效率原因,我需要以这种方式(通过管道)进行操作。
谢谢
答案1
在第一个命令中:
回显 $ARCHIVE | tar xz -C $TMPDIR
这是将文件名而不是文件内容通过管道传输到 tar。我无法理解这是如何工作的。
在最后的命令中列出:
tail -n+$ARCHIVE $0 | tar zxf - -C $TMPDIR
我认为这是在将文件名指定为“tail”的参数,这可能也行不通。即使 ${ARCHIVE} 是一个数字,您仍然无法将存档的尾部传送到 tar,您需要将整个存档提供给它。你为什么在这里调用 tail?更好的解决方案可能是:
tar xzvf ${ARCHIVE} -C ${TMPDIR}