จะซ่อนเอาต์พุตของเชลล์แอ็พพลิเคชันใน Linux ได้อย่างไร?


คำตอบ:


68

คุณสามารถเปลี่ยนเส้นทางผลลัพธ์ของโปรแกรมใด ๆ เพื่อไม่ให้เห็น

$ program > /dev/null

การดำเนินการนี้จะเปลี่ยนเส้นทางเอาต์พุตมาตรฐาน - คุณจะยังคงเห็นข้อผิดพลาด

$ program &> /dev/null

นี่จะเปลี่ยนเส้นทางเอาต์พุตทั้งหมดรวมถึงข้อผิดพลาด


คนแรกไม่ได้ทำงานเพื่อ wget
Jader Dias

นั่นเป็นสาเหตุที่ wget ใช้ stderr สำหรับผลลัพธ์บางส่วน คนที่สองควรทำงาน
theotherreceive

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

1
สำหรับwgetคุณสามารถใช้-qตัวเลือกเพื่อทำให้เงียบ
pkhamre

มีวิธีใดที่จะระงับเอาต์พุตที่เขียนโดยตรงไปยัง / dev / tty?
d11wtq

30

มีสามอุปกรณ์ IO ที่มีอยู่ใน commandline

 standard in - 0 
 standard out - 1 
 standard error - 2 

หากต้องการเปลี่ยนเส้นทางออกมาตรฐาน (เอาต์พุตเริ่มต้น) ไปยังไฟล์ (และเขียนทับไฟล์) ให้ใช้

 command > file.log 

ในการต่อท้าย file.log ให้ใช้ 2> s

 command >> file.log

เพื่อเปลี่ยนเส้นทางข้อผิดพลาดมาตรฐานไปที่ file.log ให้ใช้

 command 2> file.log

และเพื่อผนวก

 command 2>> file.log

เพื่อรวมเอาท์พุทเป็นหนึ่งสตรีมและส่งทั้งหมดไปยังที่เดียว

 command > file.log 2>&1 

สิ่งนี้จะส่ง 2 (stderr) เป็น 1 (stdout) และส่ง stdout ไปที่ file.log

โปรดสังเกตว่าอาจเป็นไปได้ที่จะเปลี่ยนเส้นทางมาตรฐานเป็นคำสั่งที่คาดว่า stdin

 command << file.txt 

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


ใครสามารถอธิบายวิธีการใช้command > file.log 2>&1งานได้บ้าง
คอรีไคลน์

คุณอยากรู้ระดับต่ำแค่ไหน?
Matt Simmons

3
@nomoreink: ก็จริง 2 คำสั่งอย่างใดอย่างหนึ่งและเป็นคนที่สองคือ> file 2>&1คนแรกเปลี่ยนเส้นทางออกมาตรฐานไปยังไฟล์ ตัวที่สองใช้ตัวอธิบายไฟล์ที่สองและเปลี่ยนเส้นทางไปที่ตัวที่หนึ่ง คุณสามารถทำย้อนกลับเปลี่ยนเส้นทางออกมาตรฐานข้อผิดพลาดมาตรฐานที่ใช้แล้วเปลี่ยนเส้นทางข้อผิดพลาดมาตรฐานไปยังไฟล์ที่มี>&2 2> file
Hubert Kario

12

ปิดบัง stdout

./command >/dev/null

ซ่อนstdoutและstderr

./command >/dev/null 2>&1

ซ่อนstdoutและstderrปล่อยเทอร์มินัล (เรียกใช้คำสั่งในเบื้องหลัง)

./command >/dev/null 2>&1 &

3

หากคุณต้องการซ่อนเอาท์พุท (และไม่บันทึกลงในไฟล์) คุณสามารถใช้:

แก้ไข:

$ command &> / dev / null


การดำเนินการนี้จะเปลี่ยนเส้นทางผลลัพธ์ไปยังไฟล์ชื่อ null
theotherreceive

มันสร้างไฟล์ null
Jader Dias

1
คุณจะไม่ได้มีความหมาย / dev / null คุณจะ?
Babu

1
ใช่ฉันต้องการ Babu ฉันหมายถึง $ command &> / dev / null ฉันขอโทษที่พิมพ์เร็วเกินไปเพื่อประโยชน์ของตัวเอง
Lucho

2

สำหรับ Mac OS X (10.6 "Snow Leopard"):

หากคุณต้องการซ่อนเอาต์พุตโดยไม่แจ้งให้โปรแกรมทราบโดยตรวจสอบตัวอธิบายไฟล์เอาต์พุต / ข้อผิดพลาดคุณสามารถลองใช้สิ่งต่อไปนี้ในเชลล์:

stty flusho; command ;stty -flusho

หรือถ้าคุณต้องการซ่อนอินพุตจากเทอร์มินัลด้วยวิธี:

stty  -echo; command ;stty  echo

ดูหน้าคู่มือ stty (1) สำหรับข้อมูลเพิ่มเติม

สำหรับ Linux สิ่งที่ฉันรู้ก็คือ Ubunutu (10.04 "Lucid") และบางส่วน "Debian / Arch" (ความเห็นด้านล่าง - tnx hendry) ไม่มีการflushoตั้งค่า (และฉันไม่เห็นอะไรที่เหมาะสมใน man-page) . การechoตั้งค่าทำงานบน Ubuntu ต่อไป


stty เริ่มต้นของฉันภายใต้ Debian / Arch ไม่มีตัวเลือกเหล่านี้
hendry

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