題 在Bash中發送模擬擊鍵


我最近一直在嘗試編寫一個可以用來的腳本 自動化我的c ++程序 在bash中。如果你知道AutoIt,我可以簡單地向你展示我想要做的一個例子:

send("1{enter}")

要么

send("!a")

對於那些不會說AutoIt的人:

第一個示例發送模擬的“1”擊鍵,然後輸入(CR)

第二個例子發送alt-a

我特意試著這樣做 慶典沒有其他腳本語言可以做到

而且,我願意  喜歡勺子餵。請 指定如何編寫它。不允許為我編寫腳本。


15
2018-04-20 15:56


起源


您是否自動執行命令行,ncurses或圖形程序? - grawity
我現在正在自動化命令行。它應該自動將輸入提供給cin(控制台輸入) - Ishan


答案:


要將文本提供給程序的標準輸入,請使用 管道和/或重定向

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塊,打印一行,丟棄其餘部分。)


11
2018-04-20 16:42



兩個答案都同樣好。但是,這是我更需要的東西。 - Ishan
工作就像一個魅力,謝謝 - greuze
CLI程序/完整終端是什麼意思? - Chris Stryczynski
CLI代表命令行界面。 CLI程序是一個在命令行上運行的簡單程序,通常在執行某項任務時使用stdin和stdout,然後完成執行並返回命令行提示符。 grep 和 curl 就是很好的例子。完整的終端程序可以控制整個窗口,例如 vim 和 screen。 - Trevin Avery


您正在尋找 xdotool

xdotool相當於你的示例命令:

xdotool key 1 Return
xdotool keydown Alt key a keyup Alt

14
2018-04-20 16:26



這很好。但我正在考慮一些純粹的bash代碼 - Ishan
@Ishan:是的 幾乎不可能用純粹的bash代碼做這些事情。 Bash不能直接使用X11,也不能使用任何現有的X11庫。您必須直接連接到X11套接字(bash只執行TCP,而不是Unix套接字),手動解析X11協議(解析bash中的二進制數據注定會失敗)並製定適當的響應。 bash是一個shell,它是 設計 通過鏈接外部工具來工作。 - grawity