Unix - tar return & ldquo; файл изменен, когда мы его читаем & rdquo; [Дубликат]

Поскольку люди, похоже, обращаются к этому вопросу, когда речь заходит об ошибках компоновщика, я собираюсь добавить это здесь.

Одной из возможных причин ошибок компоновщика с GCC 5.2.0 является то, что новая библиотека libstdc ++ ABI теперь выбран по умолчанию.

Если вы получаете ошибки компоновщика о неопределенных ссылках на символы, которые включают типы в пространстве имен std :: __ cxx11 или теге [abi: cxx11], то это, вероятно, указывает на то, что вы пытаетесь связать файлы объектов, которые были скомпилированы с различными значениями для макроса _GLIBCXX_USE_CXX11_ABI. Это обычно происходит при подключении к сторонней библиотеке, которая была скомпилирована с более старой версией GCC. Если сторонняя библиотека не может быть перестроена с новым ABI, вам нужно будет перекомпилировать свой код со старым ABI.

. Если вы вдруг получите ошибки компоновщика при переключении на GCC после 5.1.0 это было бы замечательно.

38
задан warem 3 December 2013 в 15:25
поделиться

5 ответов

Вот однострочный для игнорирования состояния выхода tar, если он равен 1. Нет необходимости в set +e, как в скрипте sandeep . Если статус выхода tar равен 0 или 1, этот однострочный лайнер вернется с статусом выхода 0. В противном случае он вернется с статусом выхода 1. Это отличается от сценария sandeep , где исходное значение статуса выхода сохраняется, если он отличается от 1.

tar -czf sample.tar.gz dir1 dir2 || [[ $? -eq 1 ]]

14
ответ дан Fabian Ritzmann 28 August 2018 в 14:09
поделиться

Чтобы улучшить однострочный слой Фабиана; скажем, что мы хотим игнорировать только статус выхода 1, но сохранить статус выхода, если это что-то еще:

tar -czf sample.tar.gz dir1 dir2 || ( export ret=$?; [[ $ret -eq 1 ]] || exit "$ret" )

Это делает все скрипт sandeep, на одной строке.

0
ответ дан Jeremy 28 August 2018 в 14:09
поделиться

Если вам нужна помощь в отладке такой проблемы, вам необходимо предоставить правило make или, по крайней мере, выписанную команду tar. Как мы можем видеть, что не так с командой, если нет команды для просмотра?

Однако, в 99% случаев такая ошибка означает, что вы создаете файл tar внутри каталога, пытаясь вставить tar-файл. Итак, когда tar пытается прочитать каталог, он находит файл tar в качестве члена каталога, начинает его читать и записывает в tar-файл, и поэтому между временем, когда он начинает читать tar-файл и когда он заканчивается Чтение tar-файла, файл tar был изменен.

Итак, например, что-то вроде:

tar cf ./foo.tar .

Невозможно «остановить», потому что это не так. Просто поместите файл tar в другое место, когда вы его создадите, или найдите другой способ (используя --exclude или что-то еще), чтобы опустить файл tar.

24
ответ дан MadScientist 28 August 2018 в 14:09
поделиться

Хотя его очень поздно, но у меня недавно была такая же проблема.

Проблема связана с тем, что dir . изменяется после создания команды xyz.tar.gz. Существует два решения:

Решение 1: tar не будет возражать, если архив создается в любом каталоге внутри .. Могут быть причины, по которым невозможно создать архив вне рабочего пространства. Работал вокруг него, создав временный каталог для размещения архива как:

mkdir artefacts
tar -zcvf artefacts/archive.tar.gz --exclude=./artefacts .
echo $?
0

Решение 2: Это мне нравится. создайте файл архива перед запуском tar:

touch archive.tar.gz
tar --exclude=archive.tar.gz -zcvf archive.tar.gz .
echo $?
0
19
ответ дан Mohammad Azim 28 August 2018 в 14:09
поделиться

Я также сталкиваюсь с сообщениями tar, «измененными по мере их чтения». Для меня это сообщение произошло, когда я делал tar-файл файловой системы Linux в среде сборки bitbake. Эта ошибка была спорадической.

Для меня это произошло не из-за создания tar-файла из того же каталога. Я предполагаю, что на самом деле файл был перезаписан или изменен во время создания файла tar.

Сообщение является предупреждением и все еще создает файл tar. Мы все еще можем подавить это предупреждающее сообщение, установив опцию

--warning=no-file-changed

( http://www.gnu.org/software/tar/manual/html_section/warnings .html )

Тем не менее, возврат кода возврата в tar равен «1» в случае предупреждения: http://www.gnu.org/software/tar/manual/ html_section / Synopsis.html

Итак, если мы вызываем tar-файл из некоторой функции в скриптах, мы можем обработать код выхода примерно так:

set +e 
tar -czf sample.tar.gz dir1 dir2
exitcode=$?

if [ "$exitcode" != "1" ] && [ "$exitcode" != "0" ]; then
    exit $exitcode
fi
set -e
41
ответ дан sandeep 28 August 2018 в 14:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: