Birden çok sıralı komutun çıktısını bir metin dosyasına yaz


22

En son Firefox'u kontrol etmeye çalışıyorum ve tüm karmaları bir TXT dosyasında almak istiyorum.

Yapmaya çalıştığım şey:

sha1sum firefox.tar.gz > sha.txt

ve ayrıca şunu da deniyorum:

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

ancak bu durumda sadece sonuncusu sha512, sha.txt dosyasına yazdırılır.

Neyi yanlış yapıyorum? Lütfen dışarıdaki biri bana bu konuda yardımcı olabilir mi?

Yanıtlar:


31

Diğerleri >(üzerine yazma) ve >>(ekleme) yönlendirme operatörleri arasındaki farkı çoktan belirttiğinden , birkaç çözüm vereceğim.

  1. Tüm komutların çıktısını tek bir dosyada göndermek için komut gruplama {}özelliğini kullanabilirsiniz bash:

    { sha1sum foo.txt ;sha512sum foo.txt ;md5sum foo.txt ;} >checksum.txt
  2. Alternatif olarak komutları bir alt kabukta çalıştırabilirsiniz ():

    ( sha1sum foo.txt ;sha512sum foo.txt ;md5sum foo.txt ) >checksum.txt

1
Hangi çözüm daha / jenerik taşınabilir olarak kabul edilir {}ya ()? Teşekkür ederim.
kodlayıcı

5
@codeaviator altkabuk: ().
heemayl

5

Sonraki komutlar >>yerine ekleme yönlendiricisini kullanmanız gerekir.>

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 OutputBash kılavuz sayfasının ( man bash) bölümüne bakın .


1

Yeniden >yönlendirici, komutun çıktısını ( stdoutbunun için stderrkullanmazsınız 2>) bundan sonra belirtilen dosyaya yazar. Zaten varsa, dosyanın üzerine yazılacaktır.

Bu davranış komutlarınızın ilki için kullanışlıdır: eğer mevcut bir dosya varsa, silinmeli ve yenisiyle değiştirilmelidir.

Ancak, öncekileri değiştirmek yerine tüm diğer çıktıları eklemeniz gerektiğinden, ek-yönlendiriciyi kullanmanız gerekir >>. Bu henüz mevcut değilse, bir dosya oluşturacaktır, ancak zaten varsa, yönlendirilmiş çıktıyı dosyaya ekler .


Ve lütfen boruyu |bir satırda birden fazla komut yazmak için kullanmayın , bu ilk komutun çıktısını ( stdout) ikinci komutun girişine ( stdin) yönlendirir.

Noktalı virgül ( ;) işlevini bash komutuna, bir komut dosyasını sanki diğerinden sonra bir komutu çalıştırmasını söylemek için kullanabilirsiniz . Bir komut başarısız olursa (dönüş kodu 0 değil), kalan komutlar hala yerine getirilir.

Ya da mantık işleçlerini seçebilirsiniz VE ( &&) veya VEYA ( ||): İki komutu bağlamak için
kullanıyorsanız &&, ikincisi sadece birincisi başarılı olursa çalıştırılır (dönüş kodu 0). Başarısız olursa, aşağıdaki komutların hiçbiri çalışmaz. Ancak sadece ikinci komutu çalıştırır ilki başarısız olursa (dönüş kodu 0 değildir)!
||

Bu durumda, noktalı virgül kullanmanızı öneririm:

md5sum firefox.tar.gz > sha.txt ; sha1sum firefox.tar.gz >> sha.txt ; sha512sum firefox.tar.gz >> sha.txt 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.