IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

WSLで始めるUbuntu

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第32回 端末について知ろう (宮崎悟) 2021年8月

前回は、bashのジョブとそのコントロール方法について説明しました。今回は、前回言及した端末(ターミナル)について説明します。

端末(ターミナル)とは

端末(ターミナル)は、コンピュータへの入出するためのインタフェースデバイスです。コンピュータの黎明期にキーボードとモニターを持つ物理端末(VT100などが有名)が登場しました。現在Linuxを始めとするUNIX系OSが使用する端末は、この物理端末の仕様を引き継いでいます。

端末デバイス

端末は、Linuxを始めとするUNIX系OSではデバイスファイルとして扱われます。WSL1 では、TTYデバイス(/dev/tty0~/dev/tty63 64個固定)が使用されます。WSL2では、疑似端末PTS(pseudo terminal)が使用されます。TTYとPTSの違いは、あらかじめ固定数用意されるか、要求されるたびに/dev/pts/n として自動生成する端末を作成するかだけです。

bashが使用している端末デバイスは、ttyコマンドで表示できます。

$ tty
/dev/pts/0
端末のコントロール

端末のコントロールは、CLI(Command Line Interface)やTUI(Text User Interface)をコントロールするncursesライブラリによって行われます。ncursesライブラリはterminfoと呼ばれるDBを元に端末コントロールします。terminfoは、端末が持つ一連の機能、画面操作の実行方法、パディング要件や初期化シーケンスを指定する、端末タイプのデータベースです。

terminfoの詳細は、man terminfoで表示されますが、普段はそこまで意識する必要はありません。terminfoで使用可能な端末タイプの設定ファイルが、/lib/terminfo/*/* のファイルに存在することだけ覚えておきましょう。

端末タイプには、vt100など物理端末をエミュレートした端末タイプや、xtermやCygwinなどのソフトウェアターミナル用の端末タイプがあります。

bashなどのシェルには、環境変数TERMに端末タイプを設定します。例えば、vt100xtermxterm-256colorなどがよく使用されます。この環境変数TERMが設定されていれば、vimなどを起動した際も端末タイプが使用されます。

$ echo $TERM
xterm
$ export TERM=xterm-256color
stty コマンド

sttyコマンドは、端末の行設定の変更や表示をします。stty -aで現在の状態が表示されます。

$ stty -a
speed 38400 baud; rows 48; columns 206; line = 0;
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;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc

それぞれの意味を解説します。

特殊文字

例の^Oなどの^は、Ctrlと同時に押すことを示します。は設定されていないことを意味します。

パラメータ 説明
discard CHAR ^O 出力の破棄のオンオフを切り替える
eof CHAR ^D CHAR はファイル終端を送信する (入力の終了)
eol CHAR CHAR は行を終端する
eol2 CHAR 行末を示す別の CHAR
erase CHAR ^? CHAR は最後にタイプされた文字を削除
intr CHAR ^C CHAR は割り込みシグナルを送信
kill CHAR ^U CHAR は現在の行を削除
lnext CHAR ^V CHAR は引用された次の文字を入力
quit CHAR ^; CHAR は終了シグナルを送信
rprnt CHAR ^R CHAR は現在の行を再表示
start CHAR ^Q CHAR は停止している出力を再開
stop CHAR ^S CHAR 出力を停止
susp CHAR ^Z CHAR は端末停止シグナルを送信
swtch CHAR CHAR は別のシェル層に切り替え
werase CHAR ^W CHAR は最後にタイプされた単語を削除

上記のCHARを設定するには、sttyコマンドを以下の使用します。Ctrl-付きの文字、BSキー、TABキーを使う場合、Ctrl-Vを入力してから該当のキーを入力します。キーボード入力と期待する結果が違うときに、キーの設定変更を行いましょう。

# erase(通常はBackSpace)を変更する(C-V BSで、^?が入力される)
$ stty erase ^?

上記表は、多くの端末タイプでのデフォルト設定です。この設定で、特に問題になるなのがCtrl-s と Ctrl-q です。Ctrl-sはstopに割り当てられているため、端末上でCtrl-sを打つと入力が止まって一見何もできなくなります。この状態から抜け出すためには、Ctrl-q(start)を入力します。これらはほぼ使用しないため、.bashrcなどで以下のコマンドを実行して、無効化すると良いでしょう。

stty start ''
stty stop  ''

stty設定

sttyで行える設定について、いくつか紹介します。先頭に-をつけると、その機能が無効になります。

パラメータ 説明
制御
[-]hup/hupcl 最後のプロセスが tty を閉じたら。ハングアップシグナルを送る
入力
[-]brkint ブレークで割り込みシグナルを発生
[-]icrnl 復帰 (CR=\r) を改行 (LF=\n) に変換する
[-]ignbrk ブレーク文字を無視する
[-]igncr 復帰 (CR=\r) を無視する
[-]imaxbel 発信音を鳴らし, 文字に全入力バッファをはき出しを行わない
[-]inlcr 改行 (LF=\n) を復帰 (CR=\r) に変換する
[-]istrip 入力文字の最上位(第8)ビットを落とす
[-]iutf8 入力文字を UTF-8 と見なす
[-]iuclc 大文字を小文字に変換する
[-]ixany 開始文字だけでなく、任意の文字で出力を再開する
出力
[-]ocrnl 復帰 (CR=\r) を改行 (LF=\n) に変換する
[-]olcuc 小文字を大文字に変換する
[-]onlcr 改行 (LF=\n) を復帰改行 (CR-LF=\r\n) に変換する
[-]onlret 改行 (LF=\n) を復帰 (CR=\r) に変換する
[-]onocr 1 桁目の復帰 (CR=\r) を表示しない
ローカル設定
[-]ctlecho/echoctl ハット記法 ('^c') で制御文字をエコー
[-]echo 入力文字をエコー
[-]icanon 特殊文字 erase/kill/ werase/ rprnt を有効にする

stty での設定変更は以下のように実行します。

# iuft8 は 無効
$ stty -a
speed 38400 baud; rows 48; columns 206; line = 0;
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;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc
# iutf8が有効になる
$ stty iutf8
$ stty -a
speed 38400 baud; rows 48; columns 206; line = 0;
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;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc
終わりに

今回は、端末(ターミナル)について説明しました。普段は設定することがないのですが、Ctrl-sなどの問題があるので、知識として知っておきましょう。次回はbashの機能紹介に戻ります。次回をお楽しみに。

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes