CTC 教育サービス
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes
前回は、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に端末タイプを設定します。例えば、vt100
、xterm
、 xterm-256color
などがよく使用されます。この環境変数TERMが設定されていれば、vimなどを起動した際も端末タイプが使用されます。
$ echo $TERM
xterm
$ export TERM=xterm-256color
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で行える設定について、いくつか紹介します。先頭に-
をつけると、その機能が無効になります。
パラメータ | 説明 |
---|---|
制御 | |
[-]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