263

ユーザーがキーを押すまで実行を一時停止したい Bash シェル スクリプトがあります。DOS では、これはpauseコマンドで簡単に実行できます。スクリプトで使用できる Linux に相当するものはありますか?

4

11 に答える 11

355

readこれを行います:

user@host:~$ read -n1 -r -p "Press any key to continue..." key
[...]
user@host:~$ 

-n1、1 文字だけ待機することを指定します。それ以外の-r場合は、バックスラッシュなどを押すと、次のキーを押すまで登録されないため、生モードにする必要があります。は-pプロンプトを指定します。プロンプトにスペースが含まれている場合は引用符で囲む必要があります。引数は、押されたキーを知りたい場合にのみ必要です。そのkey場合は、 からアクセスできます$key

Bash を使用している場合は、 でタイムアウトを指定することもできます-t。これにより、キーが押されていないときに read が失敗を返すようになります。たとえば、次のようになります。

read -t5 -n1 -r -p 'Press any key in the next five seconds...' key
if [ "$?" -eq "0" ]; then
    echo 'A key was pressed.'
else
    echo 'No key was pressed.'
fi
于 2008-09-18T14:03:44.610 に答える
172

私はこれらの非常に短い方法をよく使用します。それらは @theunamedguy や @Jim のソリューションに似ていますが、タイムアウトとサイレント モードが追加されています。

私は特に最後のケースが好きで、ユーザーが を押すまでループで実行される多くのスクリプトで使用していますEnter

コマンド

  • ソリューションを入力してください

    read -rsp $'Press enter to continue...\n'
    
  • エスケープ ソリューション (-d $'\e' を使用)

    read -rsp $'Press escape to continue...\n' -d $'\e'
    
  • 任意の主要なソリューション (-n 1 を使用)

    read -rsp $'Press any key to continue...\n' -n 1 key
    # echo $key
    
  • 事前に選択された選択肢を持つ質問 (-ei $'Y' を使用)

    read -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
    # echo $key
    
  • タイムアウト解決 (-t 5 を使用)

    read -rsp $'Press any key or wait 5 seconds to continue...\n' -n 1 -t 5;
    
  • 睡眠強化エイリアス

    read -rst 0.5; timeout=$?
    # echo $timeout
    

説明

-rは、"\" や "^" などの組み合わせ文字を許可しない raw モードを指定します。

-sサイレント モードを指定します。これは、キーボード出力が必要ないためです。

-p $' prompt 'はプロンプトを指定します。プロンプトは、スペースとエスケープ文字を許可するために $' と ' の間にある必要があります。注意してください。エスケープ文字を有効にするには、ドル記号で単一引用符を挟む必要があります。それ以外の場合は、単純な引用符を使用できます。

-d $' \e 'は区切り文字として escappe を指定するため、現在のエントリの最後の文字として、これは任意の文字を入れることができますが、ユーザーが入力できる文字を入れるように注意してください。

-n 1は、1 文字のみが必要であることを指定します。

-eは readline モードを指定します。

-i $' Y 'は、readline モードで初期テキストとして Y を指定します。

-t 5は、5 秒のタイムアウトを指定します

入力を知る必要がある場合はkey serve 、-n1 の場合は押されたキー。

$? 最後のプログラムの終了コードを知るのに役立ちます。読み取りの場合は142、タイムアウトの場合は0、正しい入力です。$を入れますか?すべてのコマンドが $? を書き換えるからです。

于 2013-07-22T01:42:11.927 に答える
16

readパラメータなしでは、Enter キーを押した場合にのみ続行されます。pauseいずれかのキーを押すと、DOSコマンドが続行されます。read –n1この動作が必要な場合に使用します。

于 2008-09-18T14:15:12.007 に答える
16

This worked for me on multiple flavors of Linux, where some of these other solutions did not (including the most popular ones here). I think it's more readable too...

echo Press enter to continue; read dummy;

Note that a variable needs to be supplied as an argument to read.

于 2017-01-18T20:01:15.000 に答える
13

read -n1ポータブルではありません。同じことを行うポータブルな方法は次のとおりです。

(   trap "stty $(stty -g;stty -icanon)" EXIT
    LC_ALL=C dd bs=1 count=1 >/dev/null 2>&1
)   </dev/tty

を使用する以外 readに、プロンプトを続行するために押すだけで、次のENTERことができます。

sed -n q </dev/tty
于 2014-06-04T20:22:23.493 に答える
3

ループまたはスクリプトを一時停止する必要があり、任意のキーの代わりに Enter キーを押しても問題ない場合readは、それ自体で機能します。

do_stuff
read
do_more_stuff

これはエンドユーザーにとって使いやすいものではありませんが、簡単なスクリプトを自分で作成していて、バックグラウンドで手動で何かを実行するためにスクリプトを一時停止する必要がある場合には十分かもしれません。

于 2016-09-22T11:40:11.103 に答える
2

これで修正されるので、ENTER 以外のキーを押しても新しい行に移動します。

read -n1 -r -s -p "Press any key to continue..." ; echo

テキストを変更してより便利にすることができるため、Windowsの一時停止よりも優れています

read -n1 -r -s -p "Press any key to continue... (cant find the ANY key? press ENTER) " ; echo
于 2021-09-02T17:56:52.947 に答える
0

はい、使用します - そして、ターミナルのread両方で最も便利にするいくつかの調整があります。cron

例:

time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "

-n 120 は、読み取りステートメントを 2 分後にタイムアウトにするため、ブロックされませんcron

ターミナルでは、rsyncコマンドの実行にかかった時間を確認するのに 2 分かかります。

その後echoは、後続の bash プロンプトが次の行に表示されるようにします。

Enterそれ以外の場合は、ターミナルで を押すと、「続行...」の直後の同じ行に表示されます。

于 2018-04-04T17:03:41.547 に答える
-1

これを試して:

function pause(){
   read -p "$*"
}
于 2008-09-18T14:04:32.033 に答える