web-dev-qa-db-ja.com

DOSポーズに相当するLinuxとは何ですか?

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

219
jt.

readはこれを行います:

[email protected]:~$ read -n1 -r -p "Press any key to continue..." key
[...]
[email protected]:~$ 

-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
313
Jim

私はこれらの方法を非常に短く頻繁に使用しており、@ 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の正しい入力を知るのに役立ちます。 $を入れますか?いくつかのコマンドの後でテストする必要がある場合は、すべてのコマンドが$?

146
y.petremann

これは、他のソリューションのいくつかがここで最も人気のないものを含めて、Linuxの複数のフレーバーで機能しました。もっと読みやすいと思います...

echo Press enter to continue; read dummy;

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

14
BuvinJ

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

13
xsl

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
8
mikeserv

ループまたはスクリプトを一時停止する必要があり、任意のキーの代わりにEnterキーを押してよい場合は、readが単独でジョブを実行します。

do_stuff
read
do_more_stuff

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

2
mwfearnley

この関数はbashzshの両方で機能し、端末への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に入れてください!

1
Tom Hale

はい、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 ターミナルで押されます。

0
SDsolar

これを試して:

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