ตอนแรกฉันรู้สึกประหลาดใจ อย่างไรก็ตามหลังจากอ่านคำตอบและทำการสอบสวนเล็กน้อยดูเหมือนง่าย ดังนั้นนี่คือสิ่งที่ฉันได้พบ (ในที่สุดก็ไม่แปลกใจ)
ก่อนการเปลี่ยนเส้นทาง stdin, stdout และ stderr นั้นเป็นไปตามที่คาดว่าจะเชื่อมต่อกับอุปกรณ์เดียวกัน
#ctrl-alt-delor:~$
#↳ ll /dev/std*
lrwxrwxrwx 1 root root 15 Jun 3 20:58 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Jun 3 20:58 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Jun 3 20:58 /dev/stdout -> /proc/self/fd/1
#ctrl-alt-delor:~$
#↳ ll /proc/self/fd/*
lrwx------ 1 richard richard 64 Jun 30 19:14 /proc/self/fd/0 -> /dev/pts/12
lrwx------ 1 richard richard 64 Jun 30 19:14 /proc/self/fd/1 -> /dev/pts/12
lrwx------ 1 richard richard 64 Jun 30 19:14 /proc/self/fd/2 -> /dev/pts/12
ดังนั้นหลังจากทิศทางใหม่ส่วนใหญ่ (นั่นคือถ้า stderr) ไม่ได้เปลี่ยนเส้นทาง stderr ยังคงเชื่อมต่อกับขั้ว ดังนั้นจึงสามารถอ่านได้เพื่อรับคีย์บอร์ด
สิ่งเดียวที่จะหยุดไฟล์ที่ใช้ในทิศทางที่ไม่คาดคิดคือการประชุมและไปป์นั้นเป็นทิศทางเดียว
ตัวอย่างอื่นลอง:
cat | less
ข้อผิดพลาดนี้เกิดขึ้นหลังจากหน้าเว็บเมื่อless
พยายามอ่านเครื่องเทอร์มินัล (นี่ไม่ใช่เรื่องที่น่าประหลาดใจเช่นเดียวกับcat
การอ่านเครื่องอ่าน)
/dev/tty
มันลึกลับมากกว่านั้นไม่ใช่ลิงก์เข้า/proc/self
มา
#ctrl-alt-delor:~$
#↳ ll /dev/tty
crw-rw-rw- 1 root tty 5, 0 Jun 29 09:18 /dev/tty
ดูว่าความสัมพันธ์ระหว่างเทอร์มินัลการควบคุมปัจจุบันของฉันกับ `/ dev / tty` คืออะไร? สำหรับคำอธิบาย ขอบคุณ @StephenKitt สำหรับลิงก์
/dev/tty
ดูคำถามนี้