Bash
有沒有辦法在獲取使用者輸入的同時執行命令?
我對腳本很陌生,我有一個關於如何做某事的高級問題。
我想設計一個類似於太空侵略者的簡單遊戲,目前主要有以下兩個特點:
- 子彈每秒從螢幕頂部落下。
- 使用者可以在螢幕底部移動主艦並躲避子彈。
問題是我無法找到一種方法來不斷地向下移動子彈,同時還能獲得輸入。
主循環中的大部分程式碼:
while true #gets user input and updates screen. do read -r -sn1 -t 1 USERIN case $USERIN in D) moveleft ;; C) moveright ;; esac updatescreen #(my code makes sure that at least a second has passed since the last "updatescreen" execution before running this) done
我希望螢幕每秒更新一次,與使用者輸入無關。現在,程序在更新時很不穩定,因為有時它必須等待更長的時間才能讓輸入超時。有一個較低的讀取超時會很好,但如果我降低它,我會得到一個錯誤:“無效的超時規範”。
有沒有辦法解決這個問題,或者可能是一個完全不同的項目組織?
我找到了解決方案。基本上,您在後台執行更新循環並在前台執行主循環。它們可以使用 trap/kill 命令相互通信。
我上傳了一個 .sh 文件到 github 來給出一個完整的例子。
這是它如何工作的修改大綱:
注意:你必須使用 ctrl-c 來逃避。
#!/bin/bash update() { trap "move_left;" $LEFT trap "move_right;" $RIGHT while true; do #output whatever needed done } read_in() { trap "return;" SIGINT SIGQUIT while true; do read -s -n 1 key case key in C) kill -$RIGHT $game_pid ;; D) kill -$LEFT $game_pid ;; esac done } move_left() { #update position variable } move_right() { #update position variable } update & game_pid=$! read_in kill -9 $game_pid
使用上面連結的範例腳本作為工作範例版本,但你有它!只是對程序架構進行了一些修改。
你需要多執行緒。看看GNU 並行