Ctrl+Sで画面停止する機能を無効化する

あらすじ

たまにターミナルの応答がまったく効かなくなることがあって困ってた。

どうやらそういう命令があった模様。(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にあるように、対話モードか否かの判断は色々な方法でできる。

参考

関連記事(この記事の初版より古い記事はリンクがグレーで表示されます)

  1. 2011/12/24 [Unix] 特定のファイルを探したり除外したり(メモ)
  2. 2011/12/23 [Unix] [Vim] Vimコマンドよく使うものと覚えたいコマンドまとめ
  3. 2011/12/18 [Unix] [Vim] Vimを使い始めるためにインストールから設定まで行った
  4. 2011/12/17 [Unix] Unixでwmvファイルを他のファイルフォーマットに変換したい
  5. 2011/12/16 [Subversion] [Unix] svn infoコマンドでリビジョン番号を抜き出す
  6. 2011/12/14 [Unix] [さくらVPS] [StartUp] さくらVPSの初期設定メモ
  7. 2011/12/13 [Subversion] [Unix] svn updateコマンド以外でリビジョン番号を抜き出す
  8. 2011/12/12 [Unix] [Shell] [Solaris] ファイルの拡張子を見て適切なコマンドで解凍してくれるスクリプトを組んだ
  9. 2011/12/09 [Unix] [Solaris] Unixでファイル圧縮・解凍するときに使うコマンドをまとめた
  10. 2011/12/06 [Unix] UnixでストリーミングファイルをDLしたい
  11. 2011/12/04 [Ruby] [Mac] [Unix] 複数のRuby環境の管理・切替ができるrvmをインストールした
  12. 2011/10/08 [Unix] [Dropbox] [さくらVPS] さくらVPSにインストールしたDropboxのEnable LAN syncオプションをOFFにする
  13. 2011/04/23 [Unix] [Dropbox] [さくらVPS] さくらVPSにDropboxをインストールした