Почему я получаю сообщение об ошибке: «Не удалось открыть« / dev / st0 »при извлечении архива с помощью bsdtar?

Я установил bsdtar из источника (с сайта libarchive), потому что я не мог найти rpm или пакет в yum .

Я могу видеть сообщение помощи bsdtar . Например:

 $ bsdtar --help First option must be a mode specifier: -c Create -r Add/Replace -t List -u Update -x Extract Common Options: ... bsdtar 3.1.2 - libarchive 3.1.2 

Но когда я пытаюсь извлечь файл, я получаю следующую ошибку:

 $ bsdtar -xzC . < archive.tar.gz bsdtar: Error opening archive: Failed to open '/dev/st0' 

Как исправить эту ошибку?

В x режиме все POSIX-совместимые версии tar требуют -f читать исходный архив где-то, кроме значения по умолчанию. Чтобы читать из stdin , POSIX также требует, чтобы вы указали - как имя файла:

 $ tar -xf - < file.tar 

И GNU tar и bsdtar понимают этот синтаксис.

GNU tar отличается от POSIX тем, что он примет tar архив на stdin без явного аргумента -f - . На самом деле, POSIX говорит, что без -f - он не должен использовать stdin вообще. Из вашего вопроса ясно, что вы получаете примеры из командной строки от пользователя GNU tar .

bsdtar следует за POSIX, требуя -f - если вы хотите, чтобы он читал из stdin а не из файла.

Это подводит нас к вашему фактическому вопросу: когда не задано -f - , почему bsdtar предпочитает читать с /dev/st0 ? Это по умолчанию я упомянул выше. POSIX только говорит, что это значение по умолчанию «зависит от системы»; bsdtar предпочитает использовать имя первого узла стримера , который является /dev/st0 в Linux. 1

Вы должны сказать это вместо этого:

 $ bsdtar -xf - < archive.tar.gz 

Или, полностью пропустите перенаправление:

 $ bsdtar -xf archive.tar.gz 

Я удалил -z потому что оба bsdtar и GNU tar автоматически обнаружат сжатие gzip в режиме x . (В старых версиях GNU tar требовался флаг сжатия, но автоопределение было добавлено в версии 1.15 , выпущенной в 2004 году).

Я также удалил -C . бит, так как он просто сообщает bsdtar перейти на текущий каталог перед распаковкой архива. Это не-op .


  1. Почему по умолчанию используется первый стример? Потому что tar – это лента ARchiver . tar происходит с того времени, когда в большинстве случаев каждый блок Unix имел на самом деле ленточный накопитель.