ユーザーがキーを押すまで実行を一時停止したい Bash シェル スクリプトがあります。DOS では、これはpause
コマンドで簡単に実行できます。スクリプトで使用できる Linux に相当するものはありますか?
11 に答える
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
私はこれらの非常に短い方法をよく使用します。それらは @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、正しい入力です。$を入れますか?すべてのコマンドが $? を書き換えるからです。
read
パラメータなしでは、Enter キーを押した場合にのみ続行されます。pause
いずれかのキーを押すと、DOSコマンドが続行されます。read –n1
この動作が必要な場合に使用します。
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
.
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
ループまたはスクリプトを一時停止する必要があり、任意のキーの代わりに Enter キーを押しても問題ない場合read
は、それ自体で機能します。
do_stuff
read
do_more_stuff
これはエンドユーザーにとって使いやすいものではありませんが、簡単なスクリプトを自分で作成していて、バックグラウンドで手動で何かを実行するためにスクリプトを一時停止する必要がある場合には十分かもしれません。
これで修正されるので、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
はい、使用します - そして、ターミナルのread
両方で最も便利にするいくつかの調整があります。cron
例:
time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "
-n 120 は、読み取りステートメントを 2 分後にタイムアウトにするため、ブロックされませんcron
。
ターミナルでは、rsync
コマンドの実行にかかった時間を確認するのに 2 分かかります。
その後echo
は、後続の bash プロンプトが次の行に表示されるようにします。
Enterそれ以外の場合は、ターミナルで を押すと、「続行...」の直後の同じ行に表示されます。
これを試して:
function pause(){
read -p "$*"
}