เขียนเอาต์พุตของคำสั่งต่อเนื่องหลายคำไปยังไฟล์ข้อความ


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. อีกทางเลือกหนึ่งคุณสามารถเรียกใช้คำสั่งใน subshell ():

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

1
โซลูชันใดที่ถือว่าเป็นอุปกรณ์ทั่วไป / พกพามากกว่า{}หรือ()? ขอขอบคุณ.
codeaviator

5
@codeaviator ()subshell:
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ส่วนของหน้าทุบตีด้วยตนเอง ( man bash)


1

ตัว>เปลี่ยนเส้นทางเขียนเอาต์พุตของคำสั่ง ( stdoutไม่ใช่stderr- คุณใช้2>สำหรับสิ่งนั้น) ไปยังไฟล์ที่ระบุหลังจากนั้น หากมีอยู่แล้วไฟล์จะถูกเขียนทับ

ลักษณะการทำงานนี้มีประโยชน์สำหรับคำสั่งแรกของคุณ: หากมีไฟล์ที่มีอยู่แล้วควรลบและแทนที่ด้วยไฟล์ใหม่

>>อย่างไรก็ตามตามที่คุณต้องการที่จะผนวกเอาท์พุทเพิ่มเติมทั้งหมดแทนการแทนที่คนก่อนหน้านี้คุณจะต้องใช้ผนวก-เปลี่ยนเส้นทาง สิ่งนี้จะสร้างไฟล์หากยังไม่มีอยู่ แต่จะผนวกเอาท์พุทที่เปลี่ยนเส้นทางไปยังไฟล์หากมีอยู่แล้ว


และโปรดอย่าใช้ไพพ์|ในการเขียนหลายคำสั่งในหนึ่งบรรทัดซึ่งจะเปลี่ยนทิศทางเอาต์พุตของคำสั่งแรก ( stdout) ไปยังอินพุตของคำสั่งที่สอง ( stdin)

คุณสามารถใช้เครื่องหมายอัฒภาค ( ;) เพื่อบอกให้ bash เรียกใช้คำสั่งหนึ่งคำสั่งหลังจากนั้นอีกครั้งราวกับว่ามันเป็นไฟล์สคริปต์ หากคำสั่งล้มเหลว (โค้ดส่งคืนไม่ใช่ 0) คำสั่งที่เหลือยังคงถูกเรียกใช้งาน

หรือคุณอาจเลือกที่ผู้ประกอบการและตรรกะ ( &&) หรือ OR ( ||):
ถ้าคุณใช้&&ในการเชื่อมต่อสองคำสั่งที่สองจะเพียง แต่จะดำเนินการถ้าคนแรกที่ประสบความสำเร็จ (รหัสส่งกลับเป็น 0) หากล้มเหลวจะไม่มีคำสั่งใดต่อไปนี้ทำงาน แต่เพียงรันคำสั่งที่สองถ้าคนแรกที่ล้มเหลว (รหัสการส่งคืนไม่ได้เป็น 0)!
||

ดังนั้นในกรณีของคุณฉันขอแนะนำให้คุณใช้เครื่องหมายอัฒภาค:

md5sum firefox.tar.gz > sha.txt ; sha1sum firefox.tar.gz >> sha.txt ; sha512sum firefox.tar.gz >> sha.txt 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.