LINUX.ORG.RU

zip в stdout: длина зависит от оператора перенаправления

 ,


0

2
#!/bin/sh
# Удалить старые файлы, если есть
rm -f 1.zip 2.zip

# Записать в файл zeroes 1024 нуля
dd if=/dev/zero of=zeroes bs=1024 count=1

# Зипуем двумя способами
zip - zeroes > 1.zip
zip - zeroes >> 2.zip

# Печатаем размеры
stat -c %s 1.zip 2.zip


Вывод:
173
237

Но, чёрт возьми, КАК, Холмс?!

Хм. Аналогично. Даже более:

zip 3.zip zeroes
даёт файл такого же размера, как 1.zip, но содержимое отличается.

VovanE
()
Ответ на: комментарий от kinkstarter
unzip 2.zip 
Archive:  2.zip
warning [2.zip]:  64 extra bytes at beginning or within zipfile
  (attempting to process anyway)
file #1:  bad zipfile offset (local header sig):  64
  (attempting to re-compensate)
  inflating: zeroes                  
VovanE
()

Но, чёрт возьми, КАК, Холмс?!

иди читай про разницу режима записи и режима добавления.

novitchok ★★★★★
()
Ответ на: комментарий от novitchok

Чего? Если файл не существует, >> работает так же, как >.

kinkstarter
() автор топика
Ответ на: комментарий от VovanE

rc делает так (возможно, и csh), заместо O_APPEND:

open("2.zip", O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE, 0666) = 4
_llseek(4, 0, [0], SEEK_END)            = 0

anonymous
()
Ответ на: комментарий от kinkstarter
       O_APPEND
              The file is opened in append mode.  Before each write(2), the file offset is positioned at the end of the  file,  as
              if  with lseek(2).  O_APPEND may lead to corrupted files on NFS filesystems if more than one process appends data to
              a file at once.  This is because NFS does not support appending to a file, so the client kernel has to simulate  it,
              which can't be done without a race condition.

Похоже, оно.

kinkstarter
() автор топика

Похоже, таки баг, и исправление вроде обещали в Zip 3.1:

Thanks for the report. This looks to me like a bug. I took a quick look, and it seems that in the «>>» case, Zip knows that the archive output is not seekable, and, accordingly, sets bit 3 (data descriptors) in the general purpose bit flags, but then, after putting out the compressed data, it apparently tries to (seek back and) rewrite the local header, instead of putting out the (no-seek-needed) data descriptor. That probably explains complaints like these from «unzip -t»:

warning [ls_2.zip]: 64 extra bytes at beginning or within zipfile (attempting to process anyway) file #1: bad zipfile offset (local header sig): 64 (attempting to re-compensate)

We'll add this to the bug list.

http://www.info-zip.org/phpBB3/viewtopic.php?f=6&t=422

kinkstarter
() автор топика
Ответ на: комментарий от kinkstarter

А вот как бы поведение шелла с помощью strace отловить?

Если бы виноват был шелл, то любая операция >> давала бы тот же эффект, а так только zip косячит

futurama ★★★★★
()

Мне гораздо больше интересно, как ты дошёл до таких тестов zip.

То есть наверное тебе не просто так в голову пришла мысль заставить работать zip через >> ?

omnomnomnus
()
Ответ на: комментарий от omnomnomnus

Да я вообще извращенец ещё тот (можно было догадаться).

kinkstarter
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.