Записать вывод нескольких последовательных команд в текстовый файл

22

Я пытаюсь проверить последнюю версию Firefox и хочу получить все хэши в одном TXT-файле.

Что я пытаюсь сделать, это:

sha1sum firefox.tar.gz > sha.txt

и я пытаюсь также:

md5sum firefox.tar.gz > sha.txt | sha1sum firefox.tar.gz > sha.txt | sha512sum firefox.tar.gz > sha.txt 

но только последний в этом случае sha512 печатается в sha.txt.

Что я делаю неправильно? Пожалуйста, кто-нибудь может мне помочь с этим?

XBMCuser
источник

Ответы:

31

Поскольку другие уже указали на разницу между >(перезаписать) и >>(добавить) операторами перенаправления, я собираюсь дать пару решений.

  1. Вы можете использовать {}функцию группировки команд bashдля отправки вывода всех команд в одном файле:

    { sha1sum foo.txt ;sha512sum foo.txt ;md5sum foo.txt ;} >checksum.txt
  2. Также вы можете запустить команды в подоболочке ():

    ( sha1sum foo.txt ;sha512sum foo.txt ;md5sum foo.txt ) >checksum.txt
heemayl
источник
1
Какое решение считается более общим / портативным {}или ()? Спасибо.
кодевиатор
5
@codeaviator подоболочка: ().
Heemayl
5

Вам нужно использовать редиректор добавления >>вместо >последующих команд, например

sha1sum zeromq-4.1.2.tar.gz > sha.txt
md5sum zeromq-4.1.2.tar.gz  >> sha.txt 
sha512sum zeromq-4.1.2.tar.gz >> sha.txt 

Смотрите Appending Redirected Outputраздел справочной страницы bash (man bash ).

steeldriver
источник
1

>Редиректор записывает вывод команды (stdout , а не stderr- использовать 2>для этого) в файл , указанный после него. Если он уже существует, файл будет перезаписан.

Это поведение полезно для первой из ваших команд: если существует существующий файл, он должен быть удален и заменен новым.

Однако, поскольку вам нужно добавить все дальнейшие выходные данные вместо замены предыдущих, вам нужно использовать append-redirector >>. Это создаст файл, если он еще не существует, но добавит перенаправленный вывод в файл, если он уже существует.


И, пожалуйста, не используйте канал |для написания нескольких команд в одной строке, что перенаправит вывод первой команды (stdout ) на ввод второй команды ( stdin).

Вы можете использовать точку с запятой (; ), чтобы просто сказать bash выполнять одну команду за другой, как если бы это был файл сценария. Если команда не выполняется (код возврата не равен 0), остальные команды по-прежнему выполняются.

Или вы можете выбрать логические операторы AND ( &&) или OR ( ||):
если вы используете &&для соединения двух команд, вторая будет выполняться только в том случае, если первая удалась (код возврата равен 0). В случае сбоя ни одна из следующих команд не будет запущена. Однако только запускает вторую команду , если первая один не удалось
|| (код возврата не 0)!

Поэтому в вашем случае я бы порекомендовал вам использовать точку с запятой:

md5sum firefox.tar.gz > sha.txt ; sha1sum firefox.tar.gz >> sha.txt ; sha512sum firefox.tar.gz >> sha.txt 
Byte Commander
источник