एक पाठ फ़ाइल के लिए कई अनुक्रमिक कमांड के आउटपुट लिखें


22

मैं नवीनतम फ़ायरफ़ॉक्स की जाँच करने की कोशिश करता हूं और एक 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
@ कोटेदार उपसमूह ():।
हेमायल

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बैश मैनुअल पेज ( man bash) का अनुभाग देखें ।


1

>पुनर्निर्देशक आदेश के उत्पादन (लिखते हैं stdout, नहीं stderr- आप का उपयोग2> उस के लिए) के बाद निर्दिष्ट फ़ाइल के लिए। यदि यह पहले से मौजूद है, तो फ़ाइल अधिलेखित हो जाएगी।

यह व्यवहार आपके पहले कमांड के लिए उपयोगी है: यदि कोई मौजूदा फ़ाइल है, तो उसे हटा दिया जाना चाहिए और नए के साथ बदल दिया जाना चाहिए।

हालांकि, जैसा कि आपको पिछले वाले को बदलने के बजाय सभी और आउटपुट को जोड़ने की आवश्यकता है, आपको एपेंड-रीडायरेक्टर का उपयोग करने की आवश्यकता है >>। यदि यह अभी तक मौजूद नहीं है, तो यह एक फ़ाइल बनाएगा, लेकिन यदि यह पहले से मौजूद है, तो फ़ाइल में पुनर्निर्देशित आउटपुट को जोड़ देता है।


और कृपया |एक लाइन में कई कमांड लिखने के लिए पाइप का उपयोग न करें , जो stdoutदूसरे कमांड के इनपुट में पहले कमांड के आउटपुट ( ) को रीडायरेक्ट करेगाstdin ) में ।

आप अर्धविराम का उपयोग कर सकते हैं (; ) का उपयोग बस बैश को एक के बाद एक कमांड निष्पादित करने के लिए कह सकते हैं, जैसे कि यह एक स्क्रिप्ट फ़ाइल थी। यदि कोई आदेश विफल रहता है (रिटर्न कोड 0 नहीं है), तो शेष कमांड अभी भी निष्पादित होते हैं।

या आपने लॉजिक ऑपरेटर और ( &&) या OR ( ||) चुना हो सकता है :
यदि आप &&दो कमांड्स को जोड़ने के लिए उपयोग करते हैं, तो दूसरा केवल तभी निष्पादित किया जाएगा, यदि पहला सफल होता है (रिटर्न कोड 0 है)। यदि यह विफल रहता है, तो निम्न में से कोई भी आदेश नहीं चलेगा। लेकिन केवल दूसरा आदेश चलाता है, तो पहले एक में विफल रहा है (वापसी कोड 0 नहीं है)!
||

तो आपके मामले में मैं आपको अर्धविराम का उपयोग करने की सलाह दूंगा:

md5sum firefox.tar.gz > sha.txt ; sha1sum firefox.tar.gz >> sha.txt ; sha512sum firefox.tar.gz >> sha.txt 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.