การส่งข้อมูลไปยัง stdin ของกระบวนการโดยไม่ทำให้ EOF เกิดขึ้นภายหลัง


33

ฉันมีไฟล์ปฏิบัติการที่เริ่มต้นเชลล์แบบโต้ตอบกับผู้ใช้ เมื่อต้องการเปิดตัวเชลล์ให้ฉีดคำสั่งสองสามคำก่อนจากนั้นอนุญาตให้ผู้ใช้มีเซสชันแบบโต้ตอบ ฉันสามารถทำได้อย่างง่ายดายโดยใช้echo:

echo "command 1\ncommand 2\ncommand3" | ./shell_executable

นี้เกือบจะทำงาน ปัญหาคือคำสั่ง echo ที่ป้อน stdin ของกระบวนการจะกระทบ EOF เมื่อดำเนินการตามคำสั่งของฉันแล้ว EOF นี้ทำให้เชลล์ยกเลิกทันที (ราวกับว่าคุณกด Ctrl + D ในเชลล์)

มีวิธีฉีดคำสั่งเหล่านี้ลงใน stdin โดยไม่ทำให้ EOF ภายหลังได้หรือไม่


คุณลองเพิ่ม./shell_executableไปยังส่วนท้ายของรายการคำสั่งแล้วหรือยัง? สิ่งนั้นอาจยังคงดำเนินต่อไปแม้ว่าคุณจะมีอินสแตนซ์ที่ใช้งานอยู่สองรายการ
goldilocks

คำตอบ:


40

พบคำตอบที่ฉลาดนี้ในคำถามที่คล้ายกันที่stackoverflow

(echo -e "cmd 1\ncmd 2" && cat) | ./shell_executable

นี่เป็นการหลอกลวง catจะปั๊มเอาต์พุตของechoเข้าสู่อินพุตสตรีมของ shell_executable และรออินพุตเพิ่มเติมจนกระทั่ง EOF


@ jw013 คุณพูดถูก ฉันแก้ไขโพสต์ ขอบคุณ เมื่อฉันทดลองวงเล็บที่ไม่มีฉันเห็นcmd 1เขียนกลับ แต่ไม่ทราบว่ามันควรจะเป็น o / p ที่สร้างขึ้นโดยcmd 1
Gowtham

การทำงานนี้ยอดเยี่ยม! คุณเพิ่งช่วยฉันทีละครั้ง ขอขอบคุณ!!
jaggedsoft

21

วิธีที่สะอาดจะทำเช่นนี้น่าจะเป็นที่จะมองหาสิ่งที่ต้องการbashของ--rcfileตัวเลือก วางคำสั่งที่กำหนดเองของคุณในไฟล์ที่กำหนดเองของคุณและส่งไปยังเชลล์เชิงโต้ตอบเพื่อเริ่มทำงาน

หากไม่มีตัวเลือกดังกล่าวคุณสามารถลองทำสิ่งต่อไปนี้:

cat custom_commands_file - | ./shell_executable

catจะตีความ-ว่าเป็น stdin


ทางออกที่ดีมาก💪😠
dctremblay
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.