Bash'te benzetilmiş tuş vuruşları gönderme


19

Son zamanlarda bash benim c ++ programı otomatikleştirmek için kullanılabilecek bir komut dosyası yazmaya çalışıyorum . AutoIt biliyorsanız, size ne yapmaya çalıştığımın bir örneğini gösterebilirim:

send("1{enter}")

veya

send("!a")

OK AutoIt konuşmayanlar için:

İlk örnek, simüle edilmiş "1" tuş vuruşu ve ardından bir enter (CR) gönderir

İkinci örnek alt-a

Özellikle bunu bash'da yapmaya çalışıyorum . Başka hiçbir komut dosyası dili yapmaz

Ayrıca, ben ederim değil bir kaşıkla beslemek tercih ederim. Lütfen nasıl yazılacağını belirtin . Benim için senaryo yazmaya izin verilmiyor.


1
Bir komut satırı, ncurses veya grafik programı otomatikleştiriyor musunuz?
user1686

1
Şimdilik bir komut satırı otomatikleştiriyorum. Girişi otomatik olarak
cin'in

Yanıtlar:


16

Bir programın stdinine metin beslemek için dikey çizgiler ve / veya yeniden yönlendirme kullanın :

echo 1 | myprogram

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

myprogram <<EOF
First line
Second line
EOF

Etkileşimli CLI programlarının (durumunda değil tam terminali olanlar), adlandırılmış yöneltme veya kullanmak mümkündür yardımcı işlemci fakir-adamın bir tür olarak expect(eğer nedeniyle Tcl olmasının dışladı olan):

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]}

(Çıkış borusundan okurken dikkatli olun; örneğin head -1 <outsadece bir satır okumaz - bir tam 4k blok arabelleğe alır, bir satır yazdırır, gerisini atar.)


Her iki cevap da eşit derecede iyidir. Ama daha çok aradığım şey bu.
İşhan

CLI programı / tam terminal ne anlama geliyor?
Chris Stryczynski

CLI, Komut Satırı Arabirimi anlamına gelir. CLI programı, komut satırında çalışan basit bir programdır ve genellikle bazı görevleri gerçekleştirirken stdin ve stdout'u kullanır ve ardından yürütmeyi tamamlar ve komut satırı istemine döner. grepve curlbunun iyi örnekleridir. Tam bir terminal programı, vimve gibi tüm pencerenin kontrolünü ele alan bir şeydir screen.
Trevin Avery

16

Xdotool arıyorsunuz .

xdotool'un örnek komutlarınızın karşılığı:

xdotool key 1 Return
xdotool keydown Alt key a keyup Alt

bu iyi. ama bazı saf bash kodlarını düşünüyordum
İşhan

9
@Ishan: Saf bash kodu ile böyle şeyler yapmak neredeyse imkansız . Bash, X11'i doğrudan kullanamaz ve mevcut herhangi bir X11 kütüphanesini de kullanamaz. X11 soketine doğrudan bağlanmanız gerekir (yalnızca bash Unix soketlerini değil, TCP'yi de yapar), X11 protokolünü elle ayrıştırmalısınız (bash'daki ikili verilerin ayrıştırılması başarısız olur) ve uygun yanıtları oluşturur. bash bir kabuktur, harici araçları zincirleyerek çalışmak üzere tasarlanmıştır .
user1686
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.