Bash

有沒有辦法在獲取使用者輸入的同時執行命令?

  • October 30, 2014

我對腳本很陌生,我有一個關於如何做某事的高級問題。

我想設計一個類似於太空侵略者的簡單遊戲,目前主要有以下兩個特點:

  1. 子彈每秒從螢幕頂部落下。
  2. 使用者可以在螢幕底部移動主艦並躲避子彈。

問題是我無法找到一種方法來不斷地向下移動子彈,同時還能獲得輸入。

主循環中的大部分程式碼:

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 並行

引用自:https://unix.stackexchange.com/questions/163664