ดังที่คนอื่น ๆ ได้กล่าวไว้ linux จัดเตรียมสตรีมเอาต์พุตที่แตกต่างกันสองรายการ:
stdoutหรือ "เอาต์พุตมาตรฐาน" คือตำแหน่งที่เอาต์พุตปกติทั้งหมดไป คุณสามารถอ้างอิงได้โดยใช้อธิบายไฟล์
1
stderrหรือ "ข้อผิดพลาดมาตรฐาน" เป็นสตรีมแยกต่างหากสำหรับข้อมูลนอกวง คุณสามารถอ้างอิงได้โดยใช้อธิบายไฟล์
2
ทำไมต้องเลือกสตรีมเอาท์พุทสองแบบ พิจารณาขั้นตอนของคำสั่งจินตภาพ:
decrypt $MY_FILE | grep "secret" | sort > secrets.txt
ตอนนี้จินตนาการว่าdecrypt
คำสั่งล้มเหลวและสร้างข้อความแสดงข้อผิดพลาด หากมันส่งข้อความนั้นไปให้stdout
มันจะส่งไปยังไปป์ไลน์และหากไม่มีคำว่า "ความลับ" ที่คุณไม่เคยเห็น ดังนั้นคุณจะจบลงด้วยไฟล์เอาต์พุตที่ว่างเปล่าโดยไม่รู้ว่าเกิดอะไรขึ้น
อย่างไรก็ตามตั้งแต่จับท่อเท่านั้นstdout
ที่decrypt
คำสั่งสามารถส่งข้อผิดพลาดในการstderr
ที่พวกเขาจะได้รับการแสดงบนคอนโซล
คุณสามารถเปลี่ยนเส้นทางstdout
และstderr
เข้าด้วยกันหรือเป็นอิสระ:
# Send errors to "errors.txt" and output to "secrets.txt"
# The following two lines are equivalent, as ">" means "1>"
decrypt $MY_FILE 2> errors.txt > secrets.txt
decrypt $MY_FILE 2> errors.txt 1> secrets.txt
คุณสามารถเปลี่ยนเส้นทางข้อผิดพลาดไปยังstdout
และประมวลผลราวกับว่าพวกเขาเป็นเอาท์พุทปกติ:
# The operation "2>&1" means "redirect file descriptor 2 to file
# descriptor 1. So this sends all output from stderr to stdout.
# Note that the order of redirection is important.
decrypt $MY_FILE > errors.txt 2>&1
# This may be confusing. It will store the normal output in a file
# and send error messages to stdout, where they'll be captured by
# the pipe and then sorted.
decrypt $MY_FILE 2>&1 > output.txt | sort
คุณยังสามารถใช้รูปแบบ "shorthand" เพื่อเปลี่ยนเส้นทางทั้ง stdout และ stderr ไปยังไฟล์เดียวกัน:
decrypt $MY_FILE &> output.txt
และในที่สุด>
ผู้ประกอบการจะตัดทอนไฟล์เอาต์พุตก่อนที่จะเขียนลงไป หากคุณต้องการผนวกข้อมูลไปยังไฟล์ที่มีอยู่ให้ใช้ตัว>>
ดำเนินการแทน:
decrypt $MY_FILE 2>> more_errors.txt >> more_secrets.txt
decrypt $MY_FILE >> more_output.txt 2>&1