ในทุบตี:
$ echo hi 2>&1 1>/dev/null | cat
$
ขณะที่อยู่ใน zsh:
$ echo hi 2>&1 1>/dev/null | cat
hi
$
มีวิธีการไพพ์เฉพาะข้อผิดพลาดมาตรฐานขณะเปลี่ยนเส้นทางมาตรฐานหรือไม่
ในทุบตี:
$ echo hi 2>&1 1>/dev/null | cat
$
ขณะที่อยู่ใน zsh:
$ echo hi 2>&1 1>/dev/null | cat
hi
$
มีวิธีการไพพ์เฉพาะข้อผิดพลาดมาตรฐานขณะเปลี่ยนเส้นทางมาตรฐานหรือไม่
คำตอบ:
ด้วย zsh และด้วยmult_ios
ตัวเลือกเปิด (ตามค่าเริ่มต้น) ใน:
echo hi 2>&1 1>/dev/null | cat
1> /dev/null | cat
ถูกมองว่าเป็นการเปลี่ยนเส้นทางหลายecho
stdout 's
ดังนั้นecho
stdout จึงถูกเปลี่ยนเส้นทางไปที่ทั้งสอง/dev/null
และไปป์ที่cat
(เช่นถ้าใช้tee
)
หากต้องการยกเลิกการเปลี่ยนเส้นทางหลายครั้งคุณสามารถทำได้:
echo hi 2>&1 >&- > /dev/null | cat
นั่นคือปิด stdout (ยกเลิกการ piping) ก่อนที่จะเปลี่ยนเส้นทาง /dev/null
หรือใช้กลุ่มคำสั่งหรือเชลล์ย่อยเช่น:
{echo hi 2>&1 1>/dev/null} | cat
(echo hi 2>&1 1>/dev/null) | cat
ด้วยวิธีนี้echo
stdout ของจะถูกเปลี่ยนเส้นทางอย่างชัดเจนเพียงครั้งเดียว (การเปลี่ยนเส้นทางไปป์ถูกนำไปใช้กับกลุ่ม / subshell และสืบทอดโดยecho
)
หรือคุณสามารถปิดการใช้งานmultios
ทั้งหมด:
(setopt nomultios; echo hi 2>&1 > /dev/null | cat)
หรือคุณสามารถใช้การทดแทนกระบวนการแทนไพพ์:
echo hi 2> >(cat) > /dev/null
ระวังอย่างไรก็ตามเมื่อการควบคุมงานปิด (เช่นในสคริปต์) cat
กระบวนการจะทำงานแบบไม่พร้อมกัน (เหมือนเริ่มต้นด้วย&
)
{echo...}|cat
)
(echo hi 2>&1 1>/dev/null) | cat
อีกวิธีหนึ่งที่จะได้รับรอบเป็น