在 FreeBSD 上将流传输到 tar

在 FreeBSD 上将流传输到 tar

我正在尝试将 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}

相关内容