Ambil stdin dari file tetapi masih muncul di terminal

9

Saya memiliki program yang mengharuskan saya untuk memasukkan data saat program berjalan. Bayangkan seperti ini:

$ ./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
...

Sekarang, saya memiliki sejumlah input uji untuk menjalankan program saya. Semuanya mengandung sesuatu seperti:

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

Namun, beberapa skrip pengujian saya gagal, dan sayangnya sangat sulit bagi saya untuk menguraikan dengan tepat di mana mereka gagal, karena terminal saya terlihat seperti ini:

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

Apakah ada cara agar saya masih bisa memberi input stdinmelalui file, tetapi masih ada terminal yang muncul seolah-olah saya sudah mengetik semuanya?

Linux Mint 16 adalah OS saya jika itu penting.

Zambezi
sumber
Saya tidak tahu bagaimana melakukan ini, tetapi Anda "harus" dapat melakukan ini dengan menggunakan perangkat tty (unbuffered). Lihat stackoverflow.com/questions/8514735/… untuk beberapa petunjuk.
Joe

Jawaban:

13

Alih-alih menggunakan pengalihan input (./program <arthur.txt), yang hanya buffering input ke program Anda, Anda harus menggunakan alat seperti "berharap" untuk menunggu pertanyaan dan mengirim jawaban satu per satu.

#!/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"

Contoh yang lebih baik: http://www.pantz.org/software/expect/expect_examples_and_tips.html

beberapa pengguna
sumber
Setelah berhasil, Anda dapat mengubahnya menjadi expectskrip yang tahu apa yang menyebabkan masalah program Anda, dan tahu untuk memberi makan program Anda baris input ketiga sebagai respons terhadap "Apa warna favorit Anda?" pertanyaan - dan kemudian minta expectskrip membaca arthur.txtfile (atau file lain yang ditentukan, terstruktur dengan tepat) untuk mendapatkan input tersebut, alih-alih meminta mereka menuliskannya dalam skrip.
G-Man Mengatakan 'Reinstate Monica'
7

Inilah tepatnya yang teedigunakan untuk.

Sebagai contoh:

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

Apa yang terjadi di sini adalah tee mengambil stdin dan menyalinnya ke stdout dan mengirimkannya kembali. Sama seperti pada sambungan pipa.

Periksa tee manual (1) untuk lebih jelasnya.

Dwight Spencer
sumber
1
Apakah pesan dijamin akan muncul dalam urutan yang benar? Bahkan mengabaikan buffering, ini pada dasarnya adalah dua program yang berjalan bersamaan dan mencoba untuk menulis ke layar yang sama.
Federico Poloni
1
Bagaimana seseorang menggunakan ini dalam skenario saya? Saya mencoba membaca halaman manual, tetapi tampaknya ada lebih banyak alat ini daripada hanya penggunaan saya, dan saya tidak mengerti bagaimana saya akan menggunakannya ketika datang ke program.exedan arthur.txt.
Zambezi
@Zambezicat arthur.txt | tee >( program.exe )
gronostaj
2
tee adalah hal pertama yang terlintas di pikiran saya juga. Tapi saya sudah mencobanya dan memastikan itu tidak berhasil. Outputnya muncul secara terpisah. Dalam percobaan saya, konten arthur.txt muncul terlebih dahulu, diikuti oleh pertanyaan dari program.exe. Anda mungkin bisa membuatnya bekerja dengan "unbuffer" dari harapan, tetapi saya belum beruntung.
beberapa pengguna