回答:
read
これを行います:
user@host:~$ read -n1 -r -p "Press any key to continue..." key
[...]
user@host:~$
-n1
それが唯一の1文字を待つことを指定します。-r
あなたは、バックスラッシュのようなものを押した場合は、次のキーを打つまで、そうでない場合、それは登録されませんので、必要なrawモード、に入れ、それを。-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
Press a key to continue...
初心者でもa
キーを見つけて押すことができます; o)
read: 1: read: Illegal option -n
、コマンドをラップするbash -c 'command && command'
などしてくださいsh
。私はLandoラッパーコマンドでこれを行っています。
これらの方法は非常に短く、@ 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 'は、エスケープを区切り文字として指定するため、現在のエントリの最後の文字として、任意の文字を配置できますが、ユーザーが入力できる文字を配置するように注意してください。
-n 1は、単一の文字のみが必要であることを指定します。
-eはreadlineモードを指定します。
-i $ ' Y 'は、readlineモードの初期テキストとしてYを指定します。
-t 5は、5秒のタイムアウトを指定します
キーは、入力を知る必要がある場合に使用します。-n1の場合は、押されたキーです。
$?最後のプログラムの終了コードを読み取るために役立ちます。読み取りの場合、タイムアウトの場合は142、正しい入力は0です。$を置く?すべてのコマンドが$?を書き換えるので、いくつかのコマンドの後でテストする必要がある場合は、できるだけ早く変数に入れます。
-s
。man read
そして、read --help
助けはUbuntu 10.04.1 LTSでは助けにはなりませんでした。編集:help read
しました。残りは非推奨ですか?
read: -i: invalid option
元になりました。代わりread -rp $'Are you sure (Y/n) : ' -ei $'Y' key;
に#osxでread -rp $'kill-server: Are you sure (Y/n) : ' -d $'Y' key;
動作します。`
-i
てUbuntuで完全に機能し-d
ます。また、OSXで同じように機能するかどうかもわかりません。
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
status=none
ポータブルでもありません。代わりにstdoutとstderrを/ dev / nullにリダイレクトします。read -r line < /dev/tty
enoughtだろうために[Enter]を押します...。
settings=$(stty -g); stty raw; dd ...; stty "$settings"
tty設定を保存および復元することにも注意してください。
tr
編集もうまくいくと思いますか?
tr
パイプとして出力をバッファリングし、米国以外のキーボードには\1-\177
範囲外の文字を送信するキーがあるためです。dd
ここで慣用的な方法です。
ループまたはスクリプトを一時停止する必要があるだけで、キーの代わりにEnterキーを押しても問題ない場合はread
、それ自体で機能します。
do_stuff
read
do_more_stuff
これはエンドユーザーにとって使いやすいものではありませんが、自分で簡単なスクリプトを作成していて、バックグラウンドで手動で何かを行うために一時停止する必要がある場合には十分かもしれません。
この関数は、両方で動作bash
してzsh
、端末へのI / Oを保証します。
# Prompt for a keypress to continue. Customise prompt with $*
function pause {
>/dev/tty printf '%s' "${*:-Press any key to continue... }"
[[ $ZSH_VERSION ]] && read -krs # Use -u0 to read from STDIN
[[ $BASH_VERSION ]] && </dev/tty read -rsn1
printf '\n'
}
export_function pause
.{ba,z}shrc
大正義のためにあなたの中にそれを入れてください!
はい、使用しますread
-両方で最も役立つようにする微調整がいくつかありますcron
とターミナル。
例:
time rsync (options)
read -n 120 -p "Press 'Enter' to continue..." ; echo " "
-n 120は、読み取りステートメントを2分後にタイムアウトにするため、ブロックされません。 cron
。
ターミナルでは、rsync
コマンドの実行にかかった時間を2分で確認できます。
次に、次のecho
ように、後続のbashプロンプトが次の行に表示されます。
それ以外の場合Enterは、ターミナルでを押すと、「続行...」の直後に同じ行に表示されます。
"Enter any non-NUL character to continue"
。一部のキーは、任意の文字(のような送信されませんCtrl
...)といくつかの送信を複数(のようなF1
、Home
...)。bash
NUL文字を無視します。