Tôi đang xem xét đầu ra của một quy trình bash đang chạy được kết nối với một thiết bị đầu cuối, cho mục đích giáo dục.
Quá trình bash của tôi có PID 2883.
Tôi gõ
[OP@localhost ~]$ strace -e trace=openat,read,write,fork,vfork,clone,execve -p 2883 2> bash.strace
Vào một nhà ga. Sau đó tôi đi vào quy trình bash của mình và có các tương tác sau:
[OP@localhost ~]$ ls
Nhìn vào đầu ra, tôi thấy
strace: Process 2883 attached
read(0, "l", 1) = 1
write(2, "l", 1) = 1
read(0, "s", 1) = 1
write(2, "s", 1) = 1
read(0, "\r", 1) = 1
write(2, "\n", 1) = 1
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fec6b1d8e50) = 3917
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=3917, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
write(1, "\33]0;OP@localhost:~\7", 23) = 23
write(2, "[OP@localhost ~]$ ", 22) = 22
...
Tôi bối rối ở hai dòng cuối cùng. Có vẻ như bash đang cố gắng viết hai dấu nhắc shell? Những gì đang xảy ra ở đây?
cat
, có hai điểm khác biệt: nó đọc dòng đầu vào theo dòng và trong khi nó lặp lại đầu vào của nó trở lại thiết bị xuất chuẩn, tôi thấy đầu vào hai lần (một lần khi tôi gõ và một lần khi mèo lặp lại).