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


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.

Що я роблю неправильно? Будь ласка, хтось там може мені допомогти у цьому?

Відповіді:


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

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).


1

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

Така поведінка корисна для першої з ваших команд: якщо є вже існуючий файл, його слід видалити та замінити на новий.

Однак, як вам потрібно додати всі подальші результати замість заміни попередніх, вам потрібно скористатися перенаправленням append >>. Це створить файл, якщо він ще не існує, але додасть перенаправлений вихід у файл, якщо він вже існує.


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

Ви можете використовувати крапку з комою ( ;), щоб просто сказати bash виконувати одну команду за іншою, як ніби це файл сценарію. Якщо команда не вдається (код повернення не 0), всі інші команди все одно виконуються.

Або ви можете обрати логічні оператори AND ( &&) або АБО ( ||):
Якщо ви використовуєте &&для підключення двох команд, друга виконується лише в тому випадку , якщо перша успішна (код повернення 0). Якщо це не вдасться, жодна з наступних команд не запуститься. Однак тільки запускає другу команду , якщо перший з них не вдався (код повернення не 0)!
||

Тож у вашому випадку я рекомендую вам використовувати крапку з комою:

md5sum firefox.tar.gz > sha.txt ; sha1sum firefox.tar.gz >> sha.txt ; sha512sum firefox.tar.gz >> sha.txt 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.