Я пытаюсь передать архив 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}