การส่งการกดแป้นพิมพ์แบบจำลองใน Bash


19

ฉันเพิ่งได้รับการพยายามที่จะเขียนสคริปต์ที่สามารถนำมาใช้ในการทำงานโดยอัตโนมัติฉัน C ++ โปรแกรมในทุบตี หากคุณรู้จัก AutoIt ฉันสามารถแสดงตัวอย่างของสิ่งที่ฉันพยายามทำ:

send("1{enter}")

หรือ

send("!a")

ตกลงสำหรับผู้ที่ไม่พูด AutoIt:

ตัวอย่างแรกส่งการกดแป้น "1" จำลองแล้วตามด้วย enter (CR)

ตัวอย่างที่สองส่ง alt-a

ฉันโดยเฉพาะความพยายามที่จะทำเช่นนี้ในทุบตี ไม่มีภาษาสคริปต์อื่นที่จะทำ

นอกจากนี้ฉันไม่ต้องการให้มีช้อน กรุณาระบุวิธีการที่จะเขียนมัน ไม่อนุญาตให้เขียนสคริปต์สำหรับฉัน


1
คุณกำลังใช้โปรแกรมบรรทัดคำสั่ง ncurses หรือกราฟิกโดยอัตโนมัติหรือไม่?
user1686

1
ตอนนี้ฉันกำลังใช้คำสั่งอัตโนมัติ มันควรที่จะป้อนข้อมูลเข้าสู่ cin ของ (คอนโซลอินพุต) โดยอัตโนมัติ
Ishan

คำตอบ:


16

หากต้องการป้อนข้อความลงใน stdin ของโปรแกรมให้ใช้ไพพ์และ / หรือการเปลี่ยนเส้นทาง :

echo 1 | myprogram

(echo "First line"
 echo "Second line") | myprogram

myprogram <<EOF
First line
Second line
EOF

ในกรณีของโปรแกรม CLI แบบโต้ตอบ ( ไม่ใช่โปรแกรมแบบเต็มเทอร์มินัล) คุณสามารถใช้ไพพ์ที่มีชื่อหรือตัวประมวลผลร่วมเป็นประเภทของคนยากจนexpect(ซึ่งคุณตัดออกเนื่องจากเป็น Tcl):

mkfifo in out
myprogram <in >out &
echo "First line" >in
read -r reply <out

mkfifo in out
myprogram <in >out &
exec {infd}>in {outfd}<out
echo "First line" >&$infd
read -r reply <&$outfd

coproc foo { myprogram; }
echo "First line" >&${foo[1]}
read -r reply <&${foo[0]}

(โปรดระวังเมื่ออ่านจากท่อส่งออกเช่นhead -1 <outจะไม่อ่านเพียงบรรทัดเดียวมันจะบัฟเฟอร์หนึ่งบล็อกเต็ม 4k พิมพ์หนึ่งบรรทัดยกเลิกส่วนที่เหลือ)


ทั้งสองคำตอบนั้นดีพอ ๆ กัน แต่นี่คือสิ่งที่ฉันมองหามากขึ้น
Ishan

โปรแกรม CLI หมายถึงอะไร / เทอร์มินัลเต็มรูปแบบ?
Chris Stryczynski

CLI ย่อมาจาก Command Line Interface โปรแกรม CLI เป็นโปรแกรมง่าย ๆ ที่รันบนบรรทัดคำสั่งและโดยทั่วไปจะใช้ stdin และ stdout เนื่องจากทำหน้าที่บางอย่างแล้วจึงเสร็จสิ้นการดำเนินการและกลับสู่พรอมต์บรรทัดคำสั่ง grepและcurlเป็นตัวอย่างที่ดีของสิ่งนี้ โปรแกรมมินัลเต็มรูปแบบเป็นสิ่งที่ต้องใช้การควบคุมของหน้าต่างทั้งหมดเหมือนและvim screen
Trevin Avery

16

คุณกำลังมองหาxdotool

คำสั่งตัวอย่างของคุณเทียบเท่ากับ xdotool:

xdotool key 1 Return
xdotool keydown Alt key a keyup Alt

ดีจัง. แต่ฉันกำลังคิดเกี่ยวกับรหัสทุบตีบริสุทธิ์
Ishan

9
@Ishan: มันเป็นไปไม่ได้ในทางปฏิบัติที่จะทำสิ่งต่างๆด้วยรหัสทุบตีบริสุทธิ์ Bash ไม่สามารถใช้ X11 ได้โดยตรงและไม่สามารถใช้ไลบรารี X11 ใด ๆ ที่มีอยู่ คุณจะต้องเชื่อมต่อกับซ็อกเก็ต X11 โดยตรง (ทุบตีเท่านั้น TCP, ซ็อกเก็ต Unix ไม่ได้), แยกวิเคราะห์โปรโตคอล X11 ด้วยมือ (การแยกวิเคราะห์ข้อมูลไบนารีในทุบตีจะถูกกำหนดให้ล้มเหลว) และฝีมือการตอบสนอง apropriate ทุบตีเป็นเปลือกมันถูกออกแบบมาเพื่อทำงานโดยผูกมัดเครื่องมือภายนอก
user1686
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.