โฮมเพจ » ทำอย่างไร » คุณจะเรียกใช้คำสั่งในพื้นหลังที่ไม่มีเอาต์พุตได้อย่างไรเว้นแต่จะมีข้อผิดพลาด

    คุณจะเรียกใช้คำสั่งในพื้นหลังที่ไม่มีเอาต์พุตได้อย่างไรเว้นแต่จะมีข้อผิดพลาด

    หากคุณเป็นคนไม่ว่างสิ่งสุดท้ายที่คุณต้องการคือการใส่ใจกับการแจ้งเตือน 'ไร้ประโยชน์' จำนวนมากดังนั้นคุณจะทำให้สิ่งต่าง ๆ เงียบลงได้อย่างไร บทความถามตอบ SuperUser ในวันนี้มีคำตอบที่ยอดเยี่ยมที่จะช่วยให้ผู้อ่านลดปริมาณงานลง.

    เซสชั่นคำถามและคำตอบในวันนี้มาถึงเราด้วยความอนุเคราะห์จาก SuperUser - แผนกย่อยของ Exchange Exchange ซึ่งเป็นกลุ่มที่ขับเคลื่อนด้วยชุมชนของเว็บไซต์ถาม - ตอบ.

    คำถาม

    SuperUser reader Xster ต้องการทราบวิธีเรียกใช้คำสั่งในพื้นหลังโดยไม่มีเอาต์พุตเว้นแต่จะมีข้อผิดพลาด:

    คุณจะระงับเอาต์พุตของคำสั่งได้อย่างไร แต่แสดงว่าหากรหัสทางออกของคำสั่งมีข้อผิดพลาด?

    คุณจะได้รับคำสั่งให้ทำงานในพื้นหลังโดยไม่มีเอาต์พุตได้อย่างไรเว้นแต่จะมีข้อผิดพลาด?

    คำตอบ

    ผู้สนับสนุน SuperUser Bob และ Maximillian Laumeister มีคำตอบสำหรับเรา มาก่อน Bob:

    น่าเสียดายที่สันนิษฐานว่า stderr จะใช้สำหรับการส่งออกข้อผิดพลาดไม่ถูกต้องเสมอไป ค่อนข้าง, stderr มักจะใช้สำหรับเอาท์พุทและการวิเคราะห์แบบโต้ตอบใด ๆ และทั้งหมด (เช่นเอาท์พุทที่มีไว้สำหรับผู้ใช้ในการอ่านในการโต้ตอบแบบโต้ตอบ).(1) wget และ DD เป็นตัวอย่างที่รู้จักกันดี.

    บางคำสั่งจะมีการตั้งค่าสถานะ (เช่น. -เงียบ หรือ -เงียบ) เพื่อระงับเอาต์พุตที่ไม่ใช่ข้อผิดพลาด อ่านคู่มือของพวกเขาเพื่อดูว่ามีใครอยู่.

    อนุสัญญาอีกข้อที่ถือครองบ่อยกว่าคือ รหัสทางออก, โปรแกรมจะส่งคืนรหัสออกเมื่อออกจากโปรแกรม เป็นปกติ(2), รหัสทางออกของ 0 บ่งชี้ความสำเร็จและรหัสการออกอื่น ๆ ระบุว่ามีข้อผิดพลาด.

    กับ ทุบตี, คุณสามารถรับรหัสทางออกของคำสั่งสุดท้ายจาก $? ตัวแปร. ใน ปลา, ใช้ สถานะ $ ตัวแปร. คุณสามารถท่อ stderr ไปที่ไฟล์ชั่วคราวและพิมพ์เฉพาะเมื่อมีข้อผิดพลาดเกิดขึ้น ตัวอย่างเช่น (ปลา):

    คุณยังสามารถใช้ทางลัดบางตัวได้หากคุณไม่ได้ใช้คำสั่ง chaining:

    หรือ:

    คุณสามารถไปป์ stdout ไปยังบัฟเฟอร์เดียวกันโดยใช้ 2> & 1> / tmp / outputbuffer.

    (บันทึก: ฉันไม่รู้จริง ๆ ปลา, ดังนั้นฉันจึงปรับแนวความคิดกับสิ่งที่ฉันสามารถหาได้ในเอกสารประกอบ ไวยากรณ์อาจผิดเล็กน้อย นอกจากนี้คุณสามารถใช้ mktemp เพื่อสร้างไฟล์ชั่วคราวที่ไม่ซ้ำกัน เรียกใช้และบันทึกชื่อไฟล์ในตัวแปร)

    หากคุณต้องการเรียกใช้สิ่งต่าง ๆ ทั้งหมดในพื้นหลังของเชลล์ที่คุณใช้โดยการโต้ตอบในเวลาเดียวกันคุณควรเขียนสคริปต์เพื่อจัดการกับการซ่อนเอาต์พุตและการเรียกใช้สคริปต์ในพื้นหลังด้วยเทคนิคมาตรฐาน (ปลา) Heck คุณสามารถใส่ฟังก์ชั่นต่อไปนี้ลงไปได้ ~ / .config / ปลา / config.fish:

    โทรไปด้วย โซมาเลียทำงานเงียบ & (ที่ท้าย & ทำให้มันทำงานในพื้นหลัง)

    โปรดทราบว่านี่จะกลืนรหัสออกดั้งเดิมและจะถ่ายโอนข้อมูลทั้งคู่ stdout และ stderr ในกรณีที่เกิดความล้มเหลว คุณสามารถปรับแต่งได้ตามความจำเป็น.

    (1) ไม่มีการรับประกันว่าเอาต์พุตข้อผิดพลาดจะไม่ปรากฏขึ้น stdout, บางโปรแกรมจะถ่ายโอนข้อมูลทั้งหมดที่นั่น!

    (2) น่าเสียดายที่นี่ยังไม่เป็นเช่นนั้นเสมอไป รหัสทางออกถูกควบคุมอย่างสมบูรณ์โดยโปรแกรมและบางอย่างจะระบุเงื่อนไขความสำเร็จบางอย่างด้วยการออกที่ไม่เป็นศูนย์ ตรวจสอบคู่มืออีกครั้ง.

    ตามด้วยคำตอบจาก Maximillian Laumeister:

    ยูทิลิตี้ Unix ส่งข้อความทั่วไปถึง stdout, และข้อความแสดงข้อผิดพลาดถึง stderr, ดังนั้นหากเราต้องการเห็นข้อความแสดงข้อผิดพลาดก็เพียงพอที่จะระงับ stdout เพื่อที่เท่านั้น stderr รับเอาต์พุตไปที่คอนโซล.

    วิธีการทำเช่นนี้ (ทั้งคู่ ทุบตี และ ปลา) คือการผนวก > / dev / null เพื่อคำสั่ง ท่อนี้ stdout เข้าสู่ความว่างเปล่า แต่ stderr (พร้อมข้อความแสดงข้อผิดพลาดของคุณ) ยังคงมาถึงคอนโซล.

    ตัวอย่างเช่น:

    คำสั่ง echo 1> / dev / null พิมพ์อะไรเพราะปกติ stdout เอาต์พุตถูกระงับและไม่มีสิ่งใดถูกเขียนไป stderr.

    คำสั่ง man doesnotexist> / dev / null พิมพ์ข้อความแสดงข้อผิดพลาดเพราะ ชาย เขียนข้อความแสดงข้อผิดพลาดไปที่ stderr.


    มีสิ่งที่จะเพิ่มคำอธิบายหรือไม่ ปิดเสียงในความคิดเห็น ต้องการอ่านคำตอบเพิ่มเติมจากผู้ใช้ Stack Exchange คนอื่นหรือไม่ ลองอ่านหัวข้อสนทนาเต็มได้ที่นี่.