さまざまなレベルの複雑さで複数の回答を読みました。ほとんどは手動で入力するとうまくいきます。
たとえば、https://stackoverflow.com/a/20913871/1841533。
以下は、この回答のコードとよく似たサンプルコードです。
_delay_end_input_=2
printf "%s\n" "answer: "
IFS= read -d '' -n 1 theanswer
while IFS= read -d '' -n 1 -t ${_delay_end_input_} more ; do
theanswer="${theanswer}${more}"
done
これは答えを手動で入力するときにも機能します。つまり、文字ごとに...
ただし、1行(または複数行)を貼り付けると、次のようになります。各文字を読み込んだ後、「残りのバッファ」を表示します。...ディスプレイが複雑になります。
画面に通常のエコーを維持しながら隠す方法を見つけることができませんでした。 (つまり、入力または貼り付けた場合でも、入力/貼り付けた内容を確認したいと思います。)
簡単な例:これは、「abcd」を1文字ずつ手動で入力したときに表示される(良い)プロンプトです。
answer: abcd
しかし、瞬時にマウスで「abcd」を貼り付けると、各文字を読み込んだ後に残りのバッファ全体を繰り返し読み込んでエコーがめちゃくちゃになります。
answer: abcdbcdcdd
TL/DR: このフラグメントは文字ごとに入力するとうまく機能しますが、貼り付けた項目の各文字を読み取った後、残りの読み取りバッファをエコーします。
答え1
解決策を見つけたかもしれませんが、誰かがより良いものを提供できることを願っています。
修正されたコード:一般的なエコーを隠し、読むたびに自分でエコーしました。
stty_orig=`stty -g` ### added this
stty -echo ### added this
_delay_end_input_=2
printf "%s\n" "answer: "
IFS= read -d '' -n 1 theanswer
printf "$theanswer" >&2 ; ### added this
while IFS= read -d '' -n 1 -t ${_delay_end_input_} more ; do
printf "$more" >&2 ; ### added this
theanswer="${theanswer}${more}"
done
stty $stty_orig ### added this
これまでに必要なことをすべて行ったようです...しかし、私はこのようにstderrで印刷するのが好きではありません...
編集する:ㅏ大きい欠点は:「バックスペース」や削除処理が難しい:1行以上のテキストを入力する人が何かを変更したいときに修正キーを解釈することは非常に難しい... 1行以上のテキスト入力を許可することでreadline最高でしょう...(おそらくPerlは1つ持っていますか?)