Я использую GNU tar. Он может автоматически определять тип сжатия при сжатии / распаковке файлов. Но мне нужно распаковать архив из stdin и тип сжатия неизвестен. Я заметил, что tar может дать мне правильное предложение вроде:
tar: Archive is compressed. Use -z option
Но я хочу, чтобы tar использовал эту опцию сжатия автоматически, без запроса ввода этого аргумента. Как я могу это сделать? Почему бы просто не распаковать tar, поскольку он уже знает тип сжатия?
Спасибо!
tarон не знает, к какому типу данных он относится, stdinдо тех пор, пока не прочитает их, и к тому времени уже слишком поздно вызывать программу распаковки. Он поддерживает gzip, bzip2 и другие. Обойти эту проблему нелегко (придется буферизовать данные), поэтому он просто говорит вам попробовать еще раз.
fork()/ exec()метод трубу данных через распаковывать утилиту. Утилита будет читать из stdinканала, и первые 4K теперь будут отсутствовать. После прочтения невозможно вернуть данные обратно в канал.
cat buffer - | gunzip. (В качестве альтернативы можно использовать неблокирующий ввод-вывод, чтобы избежать необходимости в дополнительном процессе.)