วิธีซ่อนเทอร์มินัลเอาท์พุตเมื่อสั่งงานคำสั่ง?


62

เมื่อฉันเปิดโปรแกรมบางโปรแกรมจากบรรทัดคำสั่งเช่น eclipse และโปรแกรมดูเอกสารใน 11.10 โปรแกรมจะทำการโหลดข้อมูลที่ดูเหมือนไม่สำคัญ

นอกจากนี้เมื่อพวกเขาทำงานในพื้นหลังบางครั้งพวกเขายังคงผลิตเอาต์พุตไปยังเทอร์มินัลที่ฉันกำลังทำงานอยู่ซึ่งกำลังรำคาญอยู่

ฉันต้องการให้พวกเขาเพิ่งเปิดตัวและเก็บพื้นหลังไว้ในพื้นหลัง เหตุผลของฉันคือถ้าคุณเปิดโปรแกรมเหล่านี้ผ่าน GUI (เช่นการคลิกสองครั้งที่ไอคอน) ข้อความเหล่านี้จะไม่ปรากฏแก่ฉันดังนั้นฉันไม่ต้องการมันในบรรทัดคำสั่ง


คำตอบ:


81

หากคุณสามารถหลีกเลี่ยงการเขียนเนื้อหาในคอนโซลมันขึ้นอยู่กับวิธีการสร้างผลลัพธ์จากโปรแกรม หากมันถูกสตรีมไปยังเอาต์พุตมาตรฐานนั่นก็เพียงพอแล้วที่จะทำ

$ eclipse >/dev/null

และไม่ควรสร้างเอาต์พุต

หากต้องการระงับข้อความแสดงข้อผิดพลาด:

$ eclipse >/dev/null 2>&1

หรือทุบตีเพียง:

$ eclipse &>/dev/null

แต่ถ้าพวกเขาทำมันแตกต่างกันอย่างใดอย่างหนึ่งอาจเป็นปัญหาที่จะหยุดมันจากการเขียนในคอนโซล

ถ้าเป็นไปได้ให้ใช้วิธีการแก้ปัญหาที่กำหนดโดย MuffinStateWide


2
อาจต้องการให้ที่จะกำจัดeclipse 2&>1 >/dev/null เริ่มต้นเพียงเปลี่ยนเส้นทางstderr stdoutและไม่มีวิธี "แตกต่าง" ในการทำเช่นนั้นถ้าคุณกำจัดทั้ง stdout และ stderr ลงใน nether จะไม่มีผลลัพธ์
TC1

@ TC1 โดยหลักการแล้วโปรแกรมสามารถเปิด / dev / tty อีกครั้งและพิมพ์ผลลัพธ์ที่นั่น ในทางปฏิบัติโปรแกรม GUI จะไม่ทำเช่นนั้น
Random832

@ Random832 ตามหลักการแล้วฉันแนะนำให้ใช้ stderr ไปที่ / dev / dsp หรือ aplay เพื่อ lulz พิเศษ ... :) แต่คุณพูดถูกในทางทฤษฎีแล้วมันอาจจะทำได้ในทางปฏิบัติ - ฉันน่าจะอยู่ที่ อย่างน้อยก็เขียนอีเมลที่ไม่สุภาพให้กับคนที่ทำอย่างนั้น
TC1

5
@ TC1 "2> & 1> / dev / null" จะเปลี่ยนเส้นทาง stdout ไปยังที่ฝากข้อมูลบิต แต่ stderr จะไม่ถูกเปลี่ยนเส้นทาง คุณต้องย้อนกลับคำสั่งซื้อและทำ: "> / dev / null 2> & 1"
William Pursell

9
eclipse &> /dev/nullคุณยังสามารถทำเพียงแค่: ที่ดึงดูดทั้ง stdin และ stderr เปลี่ยนเส้นทางไปยังจุด (ในทุบตี)
วอร์เรน

12

คุณสามารถสร้างฟังก์ชั่นทุบตีที่จะใช้นามแฝงชื่อคำสั่งและเพิ่มฟังก์ชั่นพิเศษบางอย่างเพื่อให้ได้สิ่งที่คุณต้องการ

ตัวอย่างเช่นสมมติว่าคุณต้องการเปิดgvim(ตัวแก้ไขข้อความ gui) จากบรรทัดคำสั่ง

คุณสามารถเขียนฟังก์ชันดังนี้:

function gvim () {
    nohup gvim "$@" > /dev/null 2>&1 & disown
}

(เพิ่มฟังก์ชั่นนี้ลงในไฟล์.bashrcหรือ.bash_aliasesไฟล์ของคุณเพื่อให้โหลดได้เสมอ)

คำอธิบาย:

  • สิ่งนี้จะนามแฝงgvimคำสั่งด้วยฟังก์ชั่นทุบตีชื่อgvim(ดังนั้นเมื่อคุณพิมพ์gvimที่พรอมต์ทุบตีมันจะเรียกgvimฟังก์ชั่นของคุณมากกว่าที่จะดำเนินการgvimคำสั่งจริงจากนั้นฟังก์ชั่นของคุณแล้วเรียกgvimคำสั่งจริงคุณสมบัติที่เพิ่มเข้ามาบางส่วน:

    • เปลี่ยนเส้นทาง stdout และ stderr ไปที่/dev/null(ไม่แสดงเอาต์พุตไปยังเทอร์มินัล)
    • ใช้&เพื่อรันคำสั่งในพื้นหลัง (เพื่อเชลล์ของคุณจะไม่ถูกบล็อก)
    • ใช้disownเพื่อลบงานพื้นหลังออกจากเปลือก (ดังนั้นมันจะไม่ปรากฏในรายการของงานที่ใช้งานอยู่)
    • ใช้nohupเพื่อแยกกระบวนการออกจากเทอร์มินัล (เพื่อให้คุณสามารถจบเซสชันเชลล์ของคุณหรือปิดเทอร์มินัลโดยไม่ต้องฆ่ากระบวนการ)

btw ฉันคิดว่านี่เป็นคำตอบที่ครอบคลุมกว่าคำตอบที่ได้รับการยอมรับจาก @Misery
Corey Goldberg

6

ลองเพิ่ม - ช่วยเป็นสวิตช์คำสั่งแล้วมองหา "เงียบ" สิ่งนี้ควรระงับเอาท์พุทหรือเพียงแค่เรียกใช้จาก GUI และเริ่มต้นด้วยสวิตช์หรือค้นหาวิธีที่จะระงับมันผ่านสคริปต์

ส่วนตัวฉันเริ่มจาก cli เพื่อรับเอาท์พุทดังนั้นฉันไม่แน่ใจว่ามันเป็นไปได้สำหรับแอพ GUI ทั้งหมด

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