2015-12-24 7 views
7

こんにちは私は、キーが押されていない限り、5秒のカウントダウン後に起こるイベントを実装しようとしています。私はこのコードを使用していますが、EnterまたはSpaceを押すと失敗します。入力またはスペースが ""として検出されるという意味では失敗します。5秒で中止するには、任意のキーを押してください

この記事を読んだ後
echo "Phoning home..." 
key="" 
read -r -s -n 1 -t 5 -p "Press any key to abort in the next 5 seconds." key 
echo 
if [ "$key" = "" ]  # No Keypress detected, phone home. 
    then python /home/myuser/bin/phonehome.py 
    else echo "Aborting." 
fi 

Bash: Check if enter was pressed

私はあきらめたとここに掲載。私が実装しようとしているものよりも良い方法がなければならないような気がします。

+2

キーの上部にダミーの値を設定するとどうなりますか?つまり、 'key = nonesuch'ですか?がんばろう。 – shellter

+0

それは本当に良いアイデアです。ありがとう!!! – inkman

答えて

2

linked questionaccepted answerは、問題の「検出enter」をカバーしています。出口コードはreadです。

処理スペースには2つの回答があります。

通常の状況下では、readは、入力からの空白と空白を切り捨てて入力を割り当てます。

これを避けるには2通りの方法があります。

  1. カスタムという名前の変数の使用を避け、代わりに$REPLYを使用することができます。 $REPLYに割り当てると、空白のトリミングやワード分割が実行されません。 (今これを探していますが、POSIX仕様ではこれを実際に見つけることができませんので、これは標準ではなく、移植不可能な展開かもしれません)

  2. IFSを空の文字列に明示的に設定します。 readコマンドでは実行されないため、空白文字のトリミングや単語分割が実行されません。

    $ IFS= read -r -s -n 1 -t 5 -p "Press any key to abort in the next 5 seconds." key; echo $? 
    # Press <space> 
    0 
    $ declare -p key 
    declare -- k=" " 
    $ unset -v k 
    $ IFS= read -r -s -n 1 -t 5 -p "Press any key to abort in the next 5 seconds." key; echo $? 
    # Wait 
    1 
    $ declare -p key 
    -bash: declare: k: not found 
    
4

readマニュアルは言う:

エンド・オブ・ファイルが に遭遇したり回読み出されていない限りreadの戻りコードは、ゼロです。

あなたのケースでは、ユーザーが許可された時間内に任意のキーをヒットした場合、中止したい場合は続行します。

#!/bin/bash 
if read -r -s -n 1 -t 5 -p "TEST:" key #key in a sense has no use at all 
then 
    echo "aborted" 
else 
    echo "continued" 
fi 

参考: Read Manual
注: 引用における重点は私のものです。

+0

この方法は最も優雅に見えました。これが私のやり方です。応答に非常に感謝します。 – inkman

+0

@inkman:ようこそ。 – sjsam

関連する問題