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

Я пытаюсь Проверить последний 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.

Что я делаю неправильно? Кто-то может там помочь мне с этим?

22
задан 18 August 2015 в 10:35

3 ответа

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

  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
    
30
ответ дан 23 November 2019 в 01:34

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

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 раздел страницы руководства (man bash).

удара
5
ответ дан 23 November 2019 в 01:34

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

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

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


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

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

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

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

md5sum firefox.tar.gz > sha.txt ; sha1sum firefox.tar.gz >> sha.txt ; sha512sum firefox.tar.gz >> sha.txt 
1
ответ дан 23 November 2019 в 01:34

Другие вопросы по тегам:

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