Lấy stdin từ tập tin nhưng vẫn có nó xuất hiện trong thiết bị đầu cuối


9

Tôi có một chương trình yêu cầu tôi nhập dữ liệu khi chương trình chạy. Hãy tưởng tượng nó giống như vậy:

$ ./program
Hi there. What's your name? Zambezi
What is your quest? To make a program which runs nicely
What is your favourite color? Red
...

Bây giờ, tôi có một số đầu vào thử nghiệm để chạy chương trình của tôi. Tất cả đều chứa một cái gì đó như:

Arthur, King of the Britons
To seek the Holy Grail
...

Tuy nhiên, một số tập lệnh thử nghiệm của tôi thất bại, và thật không may là tôi rất khó để giải mã chính xác nơi chúng thất bại, vì thiết bị đầu cuối của tôi trông như vậy:

$ ./program < arthur.txt
Hi there. What's your name?What is your quest?What is your favourite color?...

Có một cách mà tôi vẫn có thể cung cấp đầu vào stdinthông qua một tệp, nhưng vẫn có thiết bị đầu cuối xuất hiện như thể tôi đã nhập tất cả vào?

Linux Mint 16 là hệ điều hành của tôi nếu điều đó quan trọng.


Tôi không biết làm thế nào để làm điều này, nhưng bạn "nên" có thể làm điều này bằng cách sử dụng các thiết bị tty (không có bộ đệm). Xem stackoverflow.com/questions/8514735/ khăn để biết một số manh mối.
Joe

Câu trả lời:


13

Thay vì sử dụng chuyển hướng đầu vào (./program <arthur.txt), đây chỉ là bộ đệm đầu vào cho chương trình của bạn, bạn nên sử dụng các công cụ giống như "mong đợi" để chờ câu hỏi và gửi từng câu trả lời.

#!/usr/bin/expect
log_user 0
spawn ./program
log_user 1

expect {
  "*?"
}
send "Arthur, King of the Britons\r"

expect {
  "*?"
}
send "To seek the Holy Grail\r"

expect {
  "*?"
}
send "...\r"

Ví dụ tốt hơn: http://www.pantz.org/software/Exect/Exect_examples_and_tips.html


Khi bạn đã làm việc ở trên, bạn có thể phát triển nó thành một expecttập lệnh biết điều gì khiến chương trình của bạn gặp vấn đề và biết cung cấp cho chương trình của bạn dòng đầu vào thứ ba để đáp ứng với "Màu sắc yêu thích của bạn là gì?" câu hỏi - và sau đó để expecttập lệnh đọc arthur.txttệp (hoặc bất kỳ tệp nào được chỉ định, có cấu trúc phù hợp, tệp) để có được các đầu vào đó, thay vì chúng được mã hóa cứng trong tập lệnh.
G-Man nói 'Phục hồi Monica'

7

Đây chính xác là những gì teeđược sử dụng cho.

Ví dụ:

$  echo foo | tee >( grep bar ) 
foo
$

Điều xảy ra ở đây là tee lấy stdin và sao chép nó vào thiết bị xuất chuẩn và đưa nó ra ngoài một lần nữa. Cũng giống như tại khớp cho đường ống.

Kiểm tra tee manpage (1) để biết thêm chi tiết.


1
Các tin nhắn có được đảm bảo xuất hiện theo đúng thứ tự không? Ngay cả khi bỏ qua bộ đệm, đây thực chất là hai chương trình chạy đồng thời và cố gắng ghi lên cùng một màn hình.
Federico Poloni

1
Làm thế nào để một người sử dụng điều này trong kịch bản của tôi mặc dù? Tôi đã thử đọc các trang này, nhưng dường như có rất nhiều công cụ này hơn là chỉ sử dụng của tôi và tôi không hiểu lắm về cách tôi sử dụng nó khi nó đến program.exearthur.txt.
Zambezi

@Zambezicat arthur.txt | tee >( program.exe )
gronostaj

2
tee là điều đầu tiên tôi nghĩ đến Nhưng tôi đã thử nó và xác nhận nó không hoạt động. Đầu ra hiển thị riêng biệt. Trong thử nghiệm của tôi, nội dung của arthur.txt xuất hiện đầu tiên, theo sau là các câu hỏi từ chương trình.exe. Bạn có thể có thể làm cho nó hoạt động với "unbuffer" nhưng tôi không gặp may mắn.
một số người dùng
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.