質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Q&A

解決済

3回答

674閲覧

bash sleepについて

nkt070408

総合スコア29

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

1グッド

2クリップ

投稿2017/08/17 02:04

bashのプログラムにて、sleep 2s としてエラーメッセージを表示してから2秒後にループに戻る、という機能を実装しました。しかし、待っている2秒間に入力した文字が画面に出力され、次の入力にその文字が反映されてしまいます。さらに、入力した文字の分だけ削除することができてしまいます(画像参照)。これはsleepの使用上どうにもならないことでしょうか。

エラーメッセージ
2秒後

また、こういった誤入力を受け付けないようにするにはどのようにしたらいいでしょうか。

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

入力文字を捨ててから表示するのはどうでしょうか?

bash

1#!/bin/bash 2function choice(){ 3 echo " $1" 4} 5while read -p "選択してください> " no ; do 6 case $no in 7 1 ) { 8 choice 1 9 };; 10 2 ) { 11 choice 2 12 };; 13 3 ) { 14 choice 3 15 };; 16 4 ) { 17 choice 4 18 };; 19 5 ) { 20 choice 5 21 };; 22 99 ) { 23 choice 99 24 break 25 };; 26 * ) { 27 echo "[エラー] 1~5 または99を選択してください" 28 read -t 2 -n 1000 discard 29 };; 30 esac 31done

投稿2017/08/17 03:57

編集2017/08/17 04:01
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nkt070408

2017/08/17 07:37

回答ありがとうございます。 無事、変な動作をすることなく作ることができました。readコマンドのオプションを変えるだけでもだいぶうまくいきました。
guest

0

キーの入力待ちは、readコマンドを使うといいですよ。
こちら(BASHシェルスクリプトで「キー入力待ち」プロンプトを実装する)が参考になるかと。

投稿2017/08/17 02:28

sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nkt070408

2017/08/17 02:47

回答ありがとうございます。readコマンドでは-sを使って入力を出力しないでEnterキーでのみ終了する、といったところまでは実装できました。ただ、これを秒指定と組み合わせることはできませんでした。
sazi

2017/08/17 03:01

秒指定って何です?sleepの間隔のことですか? sleepは要らないんじゃないかと言いたかったのです。 良ければ、概略でもよいので、コードを追加してもらえると助かります。
nkt070408

2017/08/17 04:14

秒指定=sleepという認識で大丈夫です。 確かに、sleepを使わないほうがスマートになると思うんですが2秒後に戻る、という問題文だったため使用しています。概略でもコードを載せたいのですが、sleepの部分以外は特に問題がないため追加すべきかがわからない、というのが現状です。
sazi

2017/08/17 04:29 編集

ああ、それなら他の方の回答にもあるように、-t(タイムアウト秒)オプションの指定ですけど、整数値で指定すれば大丈夫じゃないかと。
nkt070408

2017/08/17 07:39

結局sleepコマンドは使わない方向にしました。 タイムアウトの指定でうまいこといったのでそちらを採用させていただきます。
guest

0

ベストアンサー

ちょっとテストし切れてませんが、多分これで読み捨てられると思います。

Bash

1while read -t 0.001 -N 1 dmy 2do : 3done

投稿2017/08/17 02:28

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nkt070408

2017/08/17 02:48

回答ありがとうございます。 試してみましたが自分では理解できなかったため、解説していただけないでしょうか?
otn

2017/08/17 03:15

試して期待通りの動作だったのでしょうか?
nkt070408

2017/08/17 04:02

いえ、試してみたところ、read invalid timeout specificationとエラーが出てしまい、うまくいきませんでした。
otn

2017/08/17 04:20

Bashのバージョンが古いのでしょうか?4.1.2だとうまく行きます。しかし今時それより古い物があるとも思えないのですが。 Bashのバージョンは、bash --version で。
nkt070408

2017/08/17 04:26

わざわざご丁寧にありがとうございます。 Bashのバージョンは3.2.25です。どこにも記述していなかったのですが仮想環境で行っています。
otn

2017/08/17 06:53

なんとバージョン3とは。それって、OSもサポート切れの古いやつではないですか? read -t 1 -N 1 dmy で、エラーは出ないと思いますが、待ちが最大3秒になってしまいます。 read -t 1 -N 1 dmy は、何かキーイン文字が入力済であればそれを読み捨て、何もキーイン済がなければ1秒間キーインを待ちます。 while ~ do : done で、それを入力済キーがある間繰り返します。
nkt070408

2017/08/17 07:35

会社のPCなのでノーコメントでお願いします。。。 -Nが読み込むことができず、-nにしたところうまく動きました。入力文字は切り捨てられているので予期せぬ動作もなくなりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問