Trên linux, bạn có thể xử lý các mô tả tệp của ứng dụng như các tệp được đặt tên trong /dev/fd/[0-9]
. Và những gì bạn chắc chắn có thể làm với một tệp có tên và luồng đầu vào là tee
đầu vào vào tệp đó và xuất ra. Và vì vậy, những gì tôi thường làm khi thấy mình trong tình huống của bạn (như tôi thường làm) là tee
đầu vào cho cả ứng dụng đọc của tôi và to /dev/fd/2
- stderr.
Như thế này:
seq 10 | tee /dev/fd/2 | wc -c
1
2
3
4
5
6
7
8
9
10
21
Tất nhiên, ngay cả khi bạn không sử dụng hệ thống linux, điều tương tự cũng có thể được thực hiện - nếu ít cụ thể hơn trong một số trường hợp - chỉ bằng cách thực hiện ...| tee /dev/tty | ...
Nếu bạn đang nói về thiết bị đầu cuối khi bạn nói stdin
(như liên kết của bạn chỉ ra) , thì bạn vẫn có thể làm điều tương tự, mặc dù điều đó có thể khó khăn hơn một chút vì cách đệm dòng của hạt nhân. Và vì vậy, những gì tôi sẽ làm trong trường hợp đó là đăng nhập tất cả tty
i / o bằng cách gói lệnh của tôi vào luit
- bởi vì tôi thấy nó thuận tiện hơn trong hai mặc dù script
cũng có thể hoạt động theo cách tương tự.
luit
có lẽ đã được cài đặt trên hệ thống của bạn - nó thường được đóng gói w / xterm
- và nó là một công cụ cli rất đơn giản nhằm thực hiện các bản dịch UTF-8 (chức năng này có thể bị vô hiệu hóa hoàn toàn thông qua chuyển đổi cli, nhưng tôi chưa bao giờ tìm thấy lý do để làm như vậy) cho các ứng dụng đầu cuối không hiểu nó.
Nó hoạt động bằng cách xếp lớp pty của riêng nó - mà nó sở hữu fd chính - bên dưới lớp tty hiện tại và sao chép tất cả i / o từ phiên hiện tại sang lớp con của nó, nơi nó thực thi ứng dụng bạn yêu cầu. Bởi vì nó sở hữu đầu cuối chính, nó có thể dễ dàng sao chép tất cả i / o nó đọc / ghi ở nơi khác nếu muốn và nó cung cấp một phương tiện thuận tiện để yêu cầu nó làm như vậy:
luit -olog /dev/fd/2 sh -c 'read var; echo "$var"'
eecchhoo tthhiiss vvaarr??????
echo this var???
echo this var???
Ở đâu, như bạn có thể thấy, luit
ghi nhật ký vào -olog
tệp có tên của nó, tất cả đầu vào đầu cuối nhận được ngay khi có.
Việc sử dụng /dev/fd/2
gần như không hữu ích trong trường hợp đó - vì tất cả các i / o kết thúc ở cùng một nơi hai lần. Tôi thường thích mở một terminal thứ hai, truy vấn tên của nó với các tty
lệnh, và sử dụng rằng /dev/pts/[0-9]
tên như luit
/ script
's tên outfile - mà sẽ sao chép tất cả các I / O cho cả hai thiết bị đầu cuối đồng thời - vì vậy tôi có thể đọc / xem lại nó trên một và tương tác với nó trên mặt khác. tee
có thể được sử dụng để làm điều tương tự trong hầu hết các trường hợp, nhưng nó thường không có lợi thế là kết thúc chính của một pty để giới thiệu nó.
Nếu mục đích của bạn giống như bạn nói - để sao chép để xem xét tất cả đầu vào của một số quy trình - thì có lẽ bạn sẽ làm tốt nhất để tập trung vào đầu vào. strace
là hữu ích cho nhiều thứ, nhưng nếu bạn đang cố gắng để có được một báo cáo chính xác về hành vi điển hình, thì lý do là bạn có thể nên sửa đổi hành vi đó ít nhất có thể trong khi thu thập báo cáo của mình. Nói cách khác, nếu bạn muốn nhập liệu, sao chép đầu vào, đừng chèn quy trình gỡ lỗi cha mẹ và sẽ -TRAP
tạm dừng quy trình của bạn mỗi khi nó tạo ra một tòa nhà.