LinuxはDOSポーズに相当しますか?


236

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

回答:


329

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

5
厳密に言えば、そうでしょう"Enter any non-NUL character to continue"。一部のキーは、任意の文字(のような送信されませんCtrl...)といくつかの送信を複数(のようなF1Home...)。bashNUL文字を無視します。
ステファンChazelas 2014年

2
通常、Enter、スペース、Yなどの特定のキーを要求することをお勧めします。「ANY」は一部のユーザーを混乱させる可能性があります。TABキーがあるため、ANYキーがなく、潜在的に危険なキーがあることを確認してくださいESCAPE、CTRL、CMD、電源ボタンなど。これは今日ではあまり関係ありません。なぜなら、今日のコンソールは通常、「任意のキー」を正しく解釈する上級コンピュータユーザーだけが使用するためです。Apple 2設計マニュアルは、かなり古く、この主題に特化した興味深いセクションがあります(apple2scans.net/files/1982-A2F2116-m-a2e-aiiedg.pdf)。
Gellweiler

3
代わりにメッセージを使用すると、Press a key to continue...初心者でもaキーを見つけて押すことができます; o)
DJDaveMark

1
command | myscript.shまたはで問題が発生しmyscript.sh | commandます。解決策については、この回答を参照してください。
トム・ヘイル

誰かが取得した場合は、そのエラーの可能性が高いためread: 1: read: Illegal option -n、コマンドをラップするbash -c 'command && command'などしてくださいsh。私はLandoラッパーコマンドでこれを行っています。
Elijah Lynn

155

これらの方法は非常に短く、@ 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です。$を置く?すべてのコマンドが$?を書き換えるので、いくつかのコマンドの後でテストする必要がある場合は、できるだけ早く変数に入れます。


1
説明するための+1 -sman readそして、read --help助けはUbuntu 10.04.1 LTSでは助けにはなりませんでした。編集:help readしました。残りは非推奨ですか?
Cees Timmerman、2014年

1
1+は素晴らしい説明ですが、私は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;動作します。`
TinoRüb2016年

OSXでどのように機能するかはわかりませんが、いくつかのテストを行っ-iてUbuntuで完全に機能し-dます。また、OSXで同じように機能するかどうかもわかりません。
y.petremann 2016年

読む前にエコーを使用することにより、プロンプトを非常に迅速かつ
適切に回避

15

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


15

これは私にとって複数の種類のLinuxで機能しましたが、他のいくつかのソリューションでは機能しませんでした(ここで最も人気のあるものを含みます)。もっと読みやすいと思います...

echo Press enter to continue; read dummy;

への引数として変数を指定する必要があることに注意してくださいread


この答えは、私がコピーした場合、私の問題を解決し、この行を貼り付け、何らかの理由で私はDOSの一時停止とあったように多くの行が、追加行が実行されず、添付しました
セルジオ

10

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

2
status=noneポータブルでもありません。代わりにstdoutとstderrを/ dev / nullにリダイレクトします。read -r line < /dev/ttyenoughtだろうために[Enter]を押します...
ステファンChazelas 2014年

@StephaneChezalesありがとう-私はそれを知りませんでした。病気は今それを修正します。ありがとうございました-修正しました。ところで、あなたは価値のある情報の底なしの井戸です。
mikeserv 2014年

1
settings=$(stty -g); stty raw; dd ...; stty "$settings"tty設定を保存および復元することにも注意してください。
ステファンChazelas 2014年

@StephaneChezales-コンピューターではない- tr編集もうまくいくと思いますか?
mikeserv 2014年

1
いいえ、trパイプとして出力をバッファリングし、米国以外のキーボードには\1-\177範囲外の文字を送信するキーがあるためです。ddここで慣用的な方法です。
ステファンChazelas 2014年

2

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

do_stuff
read
do_more_stuff

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


これは本当ですが、データベースの場合、例を示すと最も役立ちます。
SDsolar

ありがとう、私はあなたの助言を機内に持ち込みました。コマンド名を書くだけでは後からはっきりしません。
mwfearnley 2018

1

これを試して:

function pause(){
   read -p "$*"
}

1
誰かがこれが反対票である理由を誰かが説明できますか?それはコンテンツの不足のためですか、これは悪い解決策ですか?
3ocene

4
@ 3oceneこれは、作成された関数の使用法を示していません。さらに、これには説明がありません。
parvus

同意した。この関数の呼び出し方法の例を示してください。
SDsolar

1

この関数は、両方で動作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大正義のためにあなたの中にそれを入れてください!


0

はい、使用しますread-両方で最も役立つようにする微調整がいくつかありますcronとターミナル。

例:

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

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

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

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.