ユーザー入力後にテキストを非表示にする


9

ユーザーが入力した直後に表示されたコンテンツを非表示にする方法はありますか?

たとえば、次のファイルを見てください

#!/bin/bash
read -n 1 -p 'how are you ? ' var
if [ "$var" == "y" ]
then
    echo 'Have fun'
else
    echo 'Go to Doctor'
fi

これを実行すると、出力は

how are you ? yHave fun

how are you ?ユーザーがキーを押すとすぐに消えるようなものを探しています

そして消えた後、印刷 Have fun

したがって、上記のプログラムの最後の出力は、

Have fun

注:また、このスクリプトの上のシェル画面に出力されたものはすべて消去しないでください。

使っています bash


2
オプションではなくsのclear間に使用しechoますか?
セバスト2017

1
いいえ、clear画面上にすでに印刷されている出力がある場合は、それをクリアします。@sebasth
GypsyCosmonaut

どこAre you fineから来たの?そうじゃないのHow are you
Barmar

@Barmarええ、間違って申し訳ありませんが、今修正されました
GypsyCosmonaut '16

回答:


12

以下を使用できます。

tput cr

(またはprintf '\r')カーソルを行の先頭に移動します。に続く:

tput el

行末まですべて削除します。(tcshzshも持っているechotcあなたが使用できる組み込みのtermcapものと同等terminfo elechotc ce(もechoti el中をzsh))


14

復帰(\r)を使用します。この特殊文字(機械式タイプライターの時代の残り)は、カーソルを行の先頭に戻します。次に、削除するメッセージと同じ数のスペースが必要です(これによりメッセージが上書きされます)。次のメッセージを印刷する前に、2番目のキャリッジリターンで先頭に戻ります。このようなもの:

#!/bin/bash
echo foo
read -n 1 -p 'how are you ? ' var
if [ "$var" == "y" ]
then
    printf '\r                \rHave fun\n'
else
    printf '\r                \rGo to Doctor\n'
fi

上記のスクリプトを実行すると、次のように出力されます。

$ foo.sh
foo
Have fun        

1
2つではなく、との\r間にすべてのスペースを置くことができます。\rHave fun\n
Barmar

2

これを行うには、ばか証明からエレガントな方法まで、さまざまな方法があります。

最も簡単な方法(ほとんどの作業が必要です)は、バックスペーススペースバックスペースを繰り返しますが、何度も必要です。これはテレタイプ以外のすべてで機能します(紙からインクを取り除くのは簡単ではありません)。

次のスケールは、キャリッジリターンスペースキャリッジリターンです。これは、各キャリッジリターンの前または後にラインフィードを挿入するターミナルエミュレーターでは機能しません(これはオプションのminicomであり、他のユーザーが持つように構成されている場合があります)。

次に、termcapデータベースとterminfoデータベースが使用状況を表示できるため、termcap機能コードのみに言及する端末固有のトリックがあります。(リストはこちら)

単一行の場合、列(ch)に移動してから行末(ce)に移動するのが簡単です。

複数行の応答を含むより複雑なケースでは、絶対位置の保存(sc)、プロンプト、読み取り応答、カーソル位置の復元(rc)、画面の最後までクリア(cd)があります。

ほとんどの端末エミュレータは互換性があるため、ほとんどの場合、最後の2つの回答のvt100値をハードコードできます。もちろん、すべての端末がこれらのオプションをサポートしているわけではありませんが、サポートしていないものはまれであり、時代遅れです。

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