ユーザーがキーを押すまで実行を一時停止したいBash Shellスクリプトがあります。 DOSでは、これは「一時停止」コマンドで簡単に実行できます。スクリプトで使用できるLinuxの同等物はありますか?
read
はこれを行います:
user@Host:~$ read -n1 -r -p "Press any key to continue..." key
[...]
user@Host:~$
-n1
は、単一の文字のみを待機することを指定します。 -r
は、それをrawモードにします。これは、バックスラッシュなどを押すと、次のキーを押すまで登録されないためです。 -p
はプロンプトを指定しますが、スペースが含まれる場合は引用符で囲む必要があります。 key
引数は、どのキーが押されたかを知りたい場合にのみ必要です。その場合、$key
からアクセスできます。
Bashを使用している場合は、-t
を使用してタイムアウトを指定することもできます。これにより、キーが押されていない場合に読み取りが失敗を返します。たとえば、次のとおりです。
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'
エスケープソリューション(with -d $ '\ e')
read -rsp $'Press escape to continue...\n' -d $'\e'
任意のキーソリューション(with -n 1)
read -rsp $'Press any key to continue...\n' -n 1 key
# echo $key
事前に選択された選択肢を含む質問(with -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を区切り文字として指定するため、現在のエントリの最終文字として、これが可能です任意の文字を入力しますが、ユーザーが入力できる文字を入力するように注意してください。
-n1は、単一の文字のみが必要であることを指定します。
-eは、readlineモードを指定します。
-i $ 'Y'は、readlineモードで初期テキストとしてYを指定します。
-t5は5秒のタイムアウトを指定します
key入力を知る必要がある場合、-n1の場合は押されたキーを提供します。
$?最後のプログラムの終了コード、読み取りの場合、タイムアウトの場合は142、0の正しい入力を知るのに役立ちます。 $を入れますか?いくつかのコマンドの後でテストする必要がある場合は、すべてのコマンドが$?
これは、他のソリューションのいくつかがここで最も人気のないものを含めて、Linuxの複数のフレーバーで機能しました。もっと読みやすいと思います...
echo Press enter to continue; read dummy;
read
の引数として変数を指定する必要があることに注意してください。
パラメータなしのread
は、Enterキーを押した場合にのみ続行されます。いずれかのキーを押すと、DOS pause
コマンドが続行します。この動作が必要な場合は、read –n1
を使用します。
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
エンドユーザーにとって使いやすいものではありませんが、自分で簡単なスクリプトを書いている場合には十分であり、バックグラウンドで手動で何かをするために一時停止する必要があります。
この関数は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は、readステートメントを2分後にタイムアウトにするため、cron
でブロックされません。
ターミナルでは、rsync
コマンドの実行にかかった時間を確認するために2分かかります。
その後、後続のecho
は次の行に後続のbashプロンプトが表示されるようになります。
それ以外の場合、「continue ...」の直後に同じ行に表示されます Enter ターミナルで押されます。
これを試して:
function pause(){
read -p "$*"
}