Назад | Перейти на главную страницу

Передача потока в tar на FreeBSD

Я пытаюсь передать архив 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 в виде строки находится после ARCHIVE_BELOW но я опустил его здесь, так как он огромен.

Однако, когда я делаю это на FreeBSD, я получаю следующую ошибку:

tar: Failed to open '/dev/sa0'

Я читал, что это связано с тем, что бесплатная BSD по умолчанию ожидает чтения с этого устройства, и вы можете указать ему читать из stdin, передав -f - вот так:

tail -n+$ARCHIVE $0 | tar zxf - -C $TMPDIR

Однако когда я это делаю, я получаю сообщение об ошибке:

tar: Damaged tar archive
tar: Retrying...

Может ли кто-нибудь указать, что я здесь делаю не так? Мне нужно сделать это таким образом (через трубопровод) из соображений эффективности.

Спасибо

В первой команде:

echo $ ARCHIVE | tar xz -C $ TMPDIR

Это передача имени файла в tar, а не содержимого файла. Как это работает, мне непонятно.

В последней команде вы перечисляете:

tail -n + $ АРХИВ $ 0 | tar zxf - -C $ TMPDIR

Я думаю, что это указание имени файла в качестве аргумента для «хвоста», что, вероятно, тоже не сработает. Даже если $ {ARCHIVE} является числом, вы все равно не можете передать хвост архива tar, вам нужно передать ему весь архив. Зачем ты тут вообще хвостом называешь? Лучшее решение может быть:

tar xzvf $ {АРХИВ} -C $ {TMPDIR}