Gzip -c над трубой имеет значение?

431
Thanh Trung

Я видел когда-то 2 способа написания: с и без -c

Выдают ли два следующих случая одинаковые и одинаковые скорости?

mysqldump -u root dbname | gzip > test.sql mysqldump -u root dbname | gzip -c > test.sql 

Как насчет непрерывной трубы?

mysqldump -u root dbname | gzip | anotherprogram 

Спасибо за уточнение

1

1 ответ на вопрос

3
Alex

Согласно man gzip:
« Если файлы не указаны или имя файла равно« - », стандартный ввод сжимается в стандартный вывод ».

Во всех ваших случаях вы отправляете исходный поток в gzipSTDIN, не указывая содержимое для сжатия в качестве исходного файла. В этих случаях gzipпо умолчанию отправляется сжатый поток в STDOUT, что делает -cпараметр бесполезным / избыточным.

-cОпция полезна, если вы звоните gzipв gzip -c sourceFileтак что в этом случае вместо
сжатия Исходный_файла + добавление расширения GZ + удаление Исходный_файла
он будет посылать сжатый поток в STDOUT и не будет удалять ИСЙ .
Например:

gzip -c sourceFile | anotherProgram 
Ты для уточнения! Thanh Trung 5 лет назад 0
Кроме того, я полагаю, что «скорость» на самом деле не является главной задачей: вы просто хотите найти то, что работает! Нет никаких заметных «накладных расходов», связанных с любым из этих возможных способов сделать это. Также обратите внимание, что время выполнения * любой * альтернативы будет варьироваться естественным образом от одного прогона к другому, возможно, создавая впечатление, что «один или другой« быстрее »», хотя на самом деле это не так. Mike Robinson 5 лет назад 0
Я не думаю, что `gzip` решает режим вывода на основе перенаправления`> `, а скорее, если входные файлы * a) * определены как параметры CLI или * b) * переданы с использованием` | `. Таким образом, `-c` будет обязательным в этом случае` gzip -c file1 file2> foo.gz`, но не для этого `cat file1 file2 | gzip> foo.gz`. Vlastimil Ovčáčík 5 лет назад 0
@ VlastimilOvčáčík Я не сказал, что "gzip решает режим вывода на основе`> `перенаправления", но я использовал фразу, которая заканчивается на: "* в вашем случае использования *". `-c` не обязателен, если вы хотите сжать файл1 и файл2 (` gzip file1 файл2`) отдельно, даже если это CLI. Согласно `man gzip` все, что` -c` делает: * "Записать вывод на стандартный вывод; сохранить исходный файл ** s ** без изменений." * Alex 5 лет назад 0
Итак, ваше первое предложение гласит, что `-c` не имеет никакого эффекта, так как он использует перенаправление stdout. Вы правы насчет того, что gzip по умолчанию использует stdout в его случае использования, но не по той причине, которую вы написали. Vlastimil Ovčáčík 5 лет назад 0
@ VlastimilOvčáčík Я добавил отрывок из `man gzip`, чтобы выяснить причину, по которой` gzip` игнорирует параметр `-c` в тех случаях, как redirect / pipe, где не указаны исходные файлы. Я надеюсь это то, что вы упоминаете. Alex 5 лет назад 0
Я пытался сказать, что не имеет значения, есть ли перенаправление или канал * за * командой `gzip`. Важно то, что перед ним стоит труба. Я говорил не о трейлинге `|`, а о ведущем. Я, вероятно, не прояснил это, но если вы перечитаете мои комментарии с учетом этого, это должно иметь смысл. В противном случае я прошу прощения за беспокойство. Vlastimil Ovčáčík 5 лет назад 1
@ VlastimilOvčáčík Не беспокойтесь, я ценю ваши разъяснения, которые имеют смысл сейчас и могут быть полезны для других. Я обновил свой ответ, чтобы избежать путаницы с моей предыдущей формулировкой. Alex 5 лет назад 0

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