Tulis output dari beberapa perintah berurutan ke file teks

22

Saya mencoba untuk Memeriksa Firefox terbaru dan ingin mendapatkan semua hash dalam satu file TXT.

Apa yang saya coba lakukan adalah:

sha1sum firefox.tar.gz > sha.txt

dan saya coba juga:

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

tetapi hanya yang terakhir dalam hal ini sha512 dicetak ke sha.txt.

Apa yang saya lakukan salah? Tolong bisakah seseorang di luar sana membantu saya dengan ini?

XBMCuser
sumber

Jawaban:

31

Karena orang lain sudah menunjukkan perbedaan antara operator pengalihan >(menimpa) dan >>(tambahkan), saya akan memberikan beberapa solusi.

  1. Anda dapat menggunakan {}fitur pengelompokan perintah bashuntuk mengirim output dari semua perintah dalam satu file:

    { sha1sum foo.txt ;sha512sum foo.txt ;md5sum foo.txt ;} >checksum.txt
  2. Bergantian Anda dapat menjalankan perintah dalam subkulit ():

    ( sha1sum foo.txt ;sha512sum foo.txt ;md5sum foo.txt ) >checksum.txt
heemayl
sumber
1
Solusi mana yang dianggap lebih generik / portabel {}atau ()? Terima kasih.
codeaviator
5
@codeaviator subkulit: ().
heemayl
5

Anda harus menggunakan appir redirector >>alih-alih >untuk perintah selanjutnya mis

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 

Lihat Appending Redirected Outputbagian halaman manual bash ( man bash).

Steeldriver
sumber
1

The >redirector menulis output perintah ini ( stdout, tidak stderr- Anda menggunakan 2>untuk itu) untuk file yang ditentukan setelah. Jika sudah ada, file akan ditimpa.

Perilaku ini berguna untuk yang pertama dari perintah Anda: jika ada file yang sudah ada, itu harus dihapus dan diganti dengan yang baru.

Namun, karena Anda perlu menambahkan semua output lebih lanjut alih-alih mengganti yang sebelumnya, Anda perlu menggunakan pengarah-append >>. Ini akan membuat file jika belum ada, tetapi menambahkan output diarahkan ke file, jika sudah ada.


Dan tolong jangan gunakan pipa |untuk menulis banyak perintah dalam satu baris, yang akan mengarahkan output perintah pertama ( stdout) ke input perintah kedua ( stdin).

Anda bisa menggunakan titik koma ( ;) untuk hanya memberitahu bash untuk mengeksekusi satu perintah setelah yang lain, seolah-olah itu adalah file skrip. Jika suatu perintah gagal (kode pengembalian bukan 0), perintah yang tersisa masih dijalankan.

Atau Anda dapat memilih operator logika AND ( &&) atau OR ( ||):
Jika Anda menggunakan &&untuk menghubungkan dua perintah, yang kedua hanya akan dieksekusi, jika yang pertama berhasil (kode pengembalian adalah 0). Jika gagal, tidak satu pun dari perintah berikut ini akan berjalan.
The ||namun hanya menjalankan perintah kedua jika yang pertama gagal (kode kembali tidak 0)!

Jadi dalam kasus Anda, saya akan merekomendasikan Anda untuk menggunakan titik koma:

md5sum firefox.tar.gz > sha.txt ; sha1sum firefox.tar.gz >> sha.txt ; sha512sum firefox.tar.gz >> sha.txt 
Komandan Byte
sumber