あらすじ
たまにターミナルの応答がまったく効かなくなることがあって困ってた。
どうやらそういう命令があった模様。(Ctrl+S
)多分、Windowsの保存感覚で押下していた。
知らなかった…。
環境
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.2 LTS
Release: 18.04
Codename: bionic
解決方法
Ctrl+S
を無効化する。
ただし、Bashの場合これを無効化するとインクリメンタルサーチ(i-search
)が活きるようになるのでビックリしないように。
確認
まずはCtrl+
で発動するコマンドを確認してみる。
$ stty -a
(略)
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
(略)
- intr = ^C; 割り込み(interrupt)
- quit = ^\; 終了(quit)
- erase = ^?; 最後にタイプした文字消去
- kill = ^U; 現在の行消去(パスフレーズ入力時も消去される)
- eof = ^D ファイル終了(end of file)
- start = ^Q;
- stop = ^S;
- susp = ^Z; 停止(suspend)
- rprnt = ^R;
- werase = ^W;
- lnext = ^V;
- discard = ^O;
などなど…。
無効化
startもstopも暴発した時以外使った事ないのでこの先もいらないでしょう。
$ stty start undef
$ stty stop undef
または
$ stty -ixon
の方がいいかも。
ixon (-ixon)
制御コードの START/STOP を使った出力フロー制御を有効 (無効) にします。
注意事項
これを.bashrc
に直接書くと非対話時(scp等)でコケる。(.bashrc
で標準出力などしてはいけない)
$ scp -P 3333 foo.py ubuntu@localhost:
ubuntu@localhost's password:
stty: standard input: Inappropriate ioctl for device
そのため、対話モードの時のみ実行されるようにする必要がある。
変数$-
に現在のオプションが格納されている。対話モードの場合は$-
にi
が付加されるので、これを条件にしてやればよい。
$ echo $-
himBHs
[[ $- == *i* ]] && stty -ixon
How to check if a shell is login/interactive/batch - Unix & Linux Stack Exchangeにあるように、対話モードか否かの判断は色々な方法でできる。