То, что я ожидаю от двух команд, которые всегда производят один и тот же вывод самостоятельно, заключается в том, что они всегда выдают один и тот же результат при вводе в конвейер, но, по-видимому, это не относится к tar | gzip:
[ f1]. Добавляя к этому, даже tar cfz file.tar file сам по себе производит разные выходы:
~/test$ tar cfz file2.tar file // Archiving and compressing the file
~/test$ tar cfz file3.tar file // Archiving and compressing the file again
~/test$ cmp file2.tar.gz file3.tar.gz // Comparing the output files
file2.tar.gz file3.tar.gz differ: byte 5, line 1 // File differs at byte 5
~/test$ cmp -i 5 file2.tar.gz file3.tar.gz // Comparing the output files after byte 5
~/test$
. Разделение конвейера, наконец, дает результат, который имеет смысл:
~/test$ gzip -c file.tar > file4.tar.gz
~/test$ gzip -c file.tar > file5.tar.gz
~/test$ cmp file4.tar.gz file5.tar.gz
~/test$
Похоже, что все, что происходит, происходит только тогда, когда вывод tar передается непосредственно в gzip.
Каково объяснение этого поведения?
Файлы Gzip содержат временную метку. Если вы создадите два файла gzip в разное время, они будут отличаться по времени создания, а не по контенту.