stty -echo; cat -v; stty echo
端末に送信されたキーを見る技術です。しかし、このコマンドがどのように機能するかを知りたいです。削除すると、stty -echo
入力した内容が2回印刷されます。stty -echo
端末から入力した内容が印刷されないようにすることがわかります。より具体的に言えば、私が欲しいもの" ';'を使用して最初にバックログを無効にしてから、cat -vコマンドの後に有効にできるのはなぜですか?基本的に?
答え1
;
コマンドを分離して1つずつ実行するだけです。
cat
ここでインタラクティブシェルのプロンプトでこのコマンドを入力すると、正常に終了する限り(Ctrl+をD2回使用するかスペースキーを押す場合)プロンプトに戻ると、端末デバイスローカルエコーが無効になって再度できるようになります。ワイヤー)。
cat
SIGINTまたはSIGQUITで中断された場合(Ctrl+CまたはCtrl+を押した場合\)、シェルはコマンドラインbash
全体をキャンセルするため、stty echo
コマンドはいいえ実行され、ローカルエコーは再びアクティブになりません。
zsh
シェルでは、次のことができます。
STTY=-echo cat -vt
これは、コマンド期間中にのみ特定のtty設定を変更する特別な構文です。これにより、中断されてもcat
tty設定が復元されます。
しかしzsh
、何があっても、ttyローカルエコーは常にそれ自体に復元されます。
ではbash
、ヘルパー関数を使用して次の操作を実行できます。
with_different_tty_settings() (
tty_settings=$(stty -g) # save current settings
trap 'stty "$tty_settings"' INT EXIT QUIT
set -o noglob
local IFS
stty $STTY # split $STTY on default IFS characters
"$@"
)
次のように呼び出されますcat
。
STTY=-echo with_different_tty_settings cat -vt
zsh
STTY
(ジョブの一時停止(例:+)を処理しないsとは対照的ですCtrl。)Z
に変更すると、+で送信された文字が表示STTY='-echo -isig'
されます。CtrlC
それでSTTY='raw -echo'
見ることができますみんな文字(tty行規則に従って変更されず、一度入力されると)を終了できませんcat
。
ただし、3秒間アクティビティがない場合は終了できますSTTY='raw -echo time 30 min 0'
。cat