Stdin dosyasını dosyadan alın ama yine de terminalde görünmesini sağlayın


9

Program çalışırken veri girmemi gerektiren bir programım var. Şöyle bir şey düşünün:

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

Şimdi, programımı çalıştırmak için bir dizi test girişi var. Hepsi gibi bir şey içerir:

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

Ancak, bazı test scriptlerim başarısız oluyor ve ne yazık ki terminalim böyle göründüğü için tam olarak başarısız oldukları yeri deşifre etmek benim için çok zor:

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

Hala stdinbir dosya yoluyla girdi verebilir , ama yine de terminal hepsini yazmış gibi görünmesini bir yolu var mı ?

Bu önemliyse Linux Mint 16 benim işletim sistemimdir.


Bunu nasıl yapacağımı bilmiyorum, ama (arabelleksiz) tty cihazları kullanarak bunu "gerekir" gerekir. Bazı ipuçları için stackoverflow.com/questions/8514735/… adresine bakın .
Joe

Yanıtlar:


13

Yalnızca programınıza girdi arabelleğe alan giriş yeniden yönlendirme (./program <arthur.txt) kullanmak yerine, soruları beklemek ve cevapları tek tek göndermek için araçları "beklemek" gibi kullanmalısınız.

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

Daha iyi örnekler: http://www.pantz.org/software/expect/expect_examples_and_tips.html


Yukarıdaki çalışmayı yaptıktan sonra expect, program sorunlarınızı neyin tetiklediğini ve "En sevdiğiniz renk nedir?" Yanıtına göre programınızı üçüncü girdi satırını beslemeyi bilen bir komut dosyasına dönüştürebilirsiniz. soru - ve daha sonra expectkomut arthur.txtdosyasına sabit kodlanmış olmak yerine, bu girdileri almak için komut dosyasının dosyayı (veya belirtilen herhangi bir uygun, yapılandırılmış dosyayı) okumasını sağlayın.
G-Man, 'Monica'yı Yeniden Başlat' diyor

7

Bu tam olarak ne teeiçin kullanılır.

Örneğin:

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

Burada olan şey, stdin'i alır ve stdout'a kopyalar ve tekrar dışarı çıkarır. Tıpkı borular için eklemde olduğu gibi.

Daha fazla bilgi için manpage tişörtünü (1) kontrol edin.


1
Ancak iletilerin doğru sırada görünmesi garanti ediliyor mu? Arabelleğe almayı yok saymak bile, bu aslında aynı anda çalışan ve aynı ekrana yazmaya çalışan iki programdır.
Federico Poloni

1
Ancak bunu senaryomda nasıl kullanır? Ben klavuz sayfalarını okurken çalıştı, ancak sadece benim USECASE daha bu araca çok daha fazla olduğu görülmektedir, ve ben oldukça o geldiğinde kullanmak istiyorum nasıl elde değildi program.exeve arthur.txt.
Zambezi

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

2
tee de aklıma gelen ilk şeydi. Ama denedim ve işe yaramadığını onayladım. Çıktı ayrı olarak gösterilir. Denememde önce arthur.txt içeriği görüntüleniyor, ardından program.exe'den sorular geliyor. Bu beklenti "tamponunu" ile çalışmak için almak mümkün olabilir ama hiç şansım olmadı.
bazı kullanıcılar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.