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

12

Я пытаюсь проверить последний 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 16.08.2015 в 16:19
источник

3 ответа

19

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

  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 16.08.2015 в 17:36
источник
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 16.08.2015 в 16:31
источник
1

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

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

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

И, пожалуйста, не используйте pipe | для записи нескольких команд в одной строке, что перенаправляет вывод первой команды ( 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 16.08.2015 в 17:02
источник

Ознакомьтесь с другими вопросами по меткам