คำสั่ง Unix / Linux ของ Kyle ทำหน้าที่ในการสลับ STDERR ด้วย STDOUT; อย่างไรก็ตามคำอธิบายนั้นไม่ถูกต้องนัก ผู้ประกอบการเปลี่ยนเส้นทางไม่ทำการคัดลอกหรือทำซ้ำพวกเขาเพียงแค่เปลี่ยนเส้นทางไปยังทิศทางอื่น
เขียนใหม่คำสั่งของ Kyle โดยการเลื่อน 3> & 1 ไปยังจุดสิ้นสุดเป็นการชั่วคราวทำให้เข้าใจแนวคิดได้ง่ายขึ้น:
find /var/log 1>&2 2>&3 3>&1
แม้ว่าจะเขียนด้วยวิธีนี้ Linux จะแสดงข้อผิดพลาดเนื่องจาก & 3 ยังไม่มีอยู่เนื่องจากอยู่ก่อน 3> & 1 3> บางอย่างเป็นวิธีที่จะประกาศ (define) ว่าเราจะใช้ท่อสามดังนั้นมันจะต้องอยู่ก่อนที่เราจะไหลน้ำลงในท่อนั้นตัวอย่างเช่นวิธีที่ไคล์เขียน ลองวิธีนี้เพื่อความสนุก:
((echo "STD1"; anyerror "bbbb"; echo "STD2" ) 3>&1 4>&2 1>&4 2>&3) > newSTDOUT 2> newSTDERR
การไม่มีวิธีทำสำเนาเป็นเรื่องที่น่าละอาย คุณไม่สามารถทำสิ่งต่าง ๆ เช่น "3> & 1 3> & 2" ในคำสั่งเดียวกันได้เนื่องจาก Linux จะใช้ตัวแรกที่พบและไม่สนใจตัวที่สอง
ฉันยังไม่พบวิธีส่งทั้งข้อผิดพลาดและเอาต์พุตปกติไปยังไฟล์และยังส่งสำเนาข้อผิดพลาดไปยังเอาต์พุตมาตรฐานด้วยคำสั่งเดียว สำหรับอินสแตนซ์ฉันมีงาน cron ที่ฉันต้องการให้ทั้งเอาต์พุต (ข้อผิดพลาดและมาตรฐาน) ไปที่ล็อกไฟล์และปล่อยให้ข้อผิดพลาดออกไปเพื่อทำให้ข้อความอีเมลถูกส่งไปยังแบล็กเบอร์รี่ของฉัน ฉันสามารถทำได้ด้วยสองคำสั่งโดยใช้ "tee" แต่ข้อผิดพลาดไม่แสดงในลำดับที่ถูกต้องในบรรทัดเอาต์พุตปกติในไฟล์ นี่เป็นวิธีที่น่าเกลียดที่ฉันแก้ไขปัญหา:
((echo "STD1"; sdfr "bbbb"; echo "STD2" ) 3>&1 1>&2 2>&3 | tee -a log1 ) 2>> log1
โปรดทราบว่าฉันต้องใช้ log1 สองครั้งและฉันต้องผนวกทั้งสองกรณีตัวแรกใช้ตัวเลือก "-a" สำหรับคำสั่ง "tee" และตัวที่สองใช้ ">>"
ทำcat log1คุณจะได้รับสิ่งต่อไปนี้:
STD1
STD2
-bash: sdfr: command not found
ขอให้สังเกตว่าข้อผิดพลาดไม่แสดงในบรรทัดที่สองตามที่ควร