ใช้ stdin จากไฟล์ แต่ยังคงมีมันปรากฏใน terminal


9

ฉันมีโปรแกรมที่ต้องการให้ฉันป้อนข้อมูลขณะที่โปรแกรมทำงาน ลองนึกภาพมันเป็นอย่างนั้น:

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

ตอนนี้ฉันมีอินพุตทดสอบจำนวนหนึ่งเพื่อเรียกใช้โปรแกรมของฉันกับ พวกเขาทั้งหมดมีสิ่งที่ชอบ:

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

อย่างไรก็ตามสคริปต์ทดสอบบางตัวของฉันล้มเหลวและน่าเสียดายที่มันยากมากที่ฉันจะถอดรหัสตรงจุดที่มันล้มเหลวเนื่องจากเทอร์มินัลของฉันมีลักษณะดังนี้:

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

มีวิธีที่ฉันยังสามารถให้การป้อนข้อมูลstdinผ่านไฟล์ แต่ยังคงมีเทอร์มินัลปรากฏราวกับว่าฉันได้พิมพ์มันทั้งหมดหรือไม่

Linux Mint 16 เป็นระบบปฏิบัติการของฉันหากสำคัญ


ฉันไม่ทราบวิธีการทำเช่นนี้ แต่คุณ "ควร" สามารถทำสิ่งนี้ได้โดยใช้อุปกรณ์ tty (ไม่บัฟเฟอร์) ดูstackoverflow.com/questions/8514735/…สำหรับเบาะแสบางอย่าง
Joe

คำตอบ:


13

แทนที่จะใช้การเปลี่ยนเส้นทางอินพุต (./program <arthur.txt) ซึ่งเป็นเพียงการบัฟเฟอร์อินพุตไปยังโปรแกรมของคุณคุณควรใช้เครื่องมือเช่นเดียวกับ "คาดหวัง" เพื่อรอคำถามและส่งคำตอบทีละรายการ

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

ตัวอย่างที่ดีกว่า: http://www.pantz.org/software/expect/expect_examples_and_tips.html


เมื่อคุณทำงานด้านบนได้แล้วคุณสามารถพัฒนาให้เป็นexpectสคริปต์ที่รู้ว่าอะไรเป็นสาเหตุให้โปรแกรมของคุณออกและรู้ว่าจะให้โปรแกรมของคุณป้อนบรรทัดที่สามเพื่อตอบสนองต่อ "สีโปรดของคุณคืออะไร" คำถาม - จากนั้นให้expectสคริปต์อ่านarthur.txtไฟล์ (หรือไฟล์อื่น ๆ ที่ระบุไว้อย่างเหมาะสม, โครงสร้างที่เหมาะสม) เพื่อรับอินพุตเหล่านั้นแทนที่จะให้ฮาร์ดโค้ดในสคริปต์
G-Man กล่าวว่า 'Reinstate Monica'

7

ตรงนี้เป็นสิ่งที่teeใช้สำหรับ

ตัวอย่างเช่น:

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

สิ่งที่เกิดขึ้นที่นี่คือทีใช้เวลา stdin และคัดลอกไปยัง stdout และท่อออกอีกครั้ง เช่นเดียวกับข้อต่อท่อ

ตรวจสอบรายละเอียดเพิ่มเติมได้ที่ manpage tee (1)


1
มีข้อความรับประกันว่าจะปรากฏในลำดับที่ถูกต้อง แต่? แม้จะไม่สนใจการบัฟเฟอร์นี่เป็นสองโปรแกรมที่ทำงานพร้อมกันและพยายามเขียนลงบนหน้าจอเดียวกัน
Federico Poloni

1
มีวิธีใช้สิ่งนี้ในสถานการณ์ของฉันอย่างไร ผมพยายามอ่าน manpages แต่ดูเหมือนว่าจะมีมากขึ้นในเครื่องมือนี้มากกว่าเพียงแค่ USECASE ของฉันและฉันไม่ได้ค่อนข้างได้รับวิธีการที่ฉันต้องการใช้มันเมื่อมันมาถึงและprogram.exe arthur.txt
Zambezi

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

2
ทีก็เป็นสิ่งแรกที่เข้ามาในใจฉันเช่นกัน แต่ฉันได้ลองแล้วและยืนยันว่าใช้งานไม่ได้ เอาต์พุตจะแสดงแยกกัน ในการทดสอบของฉันเนื้อหาของ arthur.txt จะปรากฏขึ้นก่อนตามด้วยคำถามจาก program.exe คุณอาจจะสามารถทำงานกับ "unbuffer" ของความคาดหวัง แต่ฉันไม่ได้โชคดี
ผู้ใช้บางคน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.