Go to main content
マニュアルページ セク ション 1: ユー ザーコマンド

印刷ビューの終了

更新: 2016年12月6日
 
 

setterm (1)

名前

setterm - tty 回線上でのストリームの構築

形式


setterm [ -t TERMNAME ]
setterm -x NAME
setterm -v

使用条件

system/locale/extra

説明

setterm は、tty 回線上で STREAMS 構成を構築するために使用します。setterm は、stdinstdout、および stderr のすべてが端末回線に接続された状態で呼び出されることが期待されていますが、通常は、標準入力のみが端末回線に接続されていても機能します。その呼び出し時には通常、何らかの種類の回線制御手順がすでに回線上にプッシュされた状態になっていますが、それは、login で使用可能な回線制御手順を getty がプッシュする必要があるからです。

setterm を引数なしで呼び出した場合、ユーザーの環境で $TERM 変数が検索されます。何も見つからなかった場合、$TERM 情報がないと後続の処理は一切行えないため、setterm は終了します。-t オプションを引数とともに指定した場合、オプションの次の引数 (TERMNAME) が端末タイプの名前であるとみなされます。その端末名が terminfo(4) データベース内で検索され、エントリからフィールド devt (存在する場合) が抽出されます。devt フィールドが存在しない場合は端末が ASCII であるとみなされますが、その場合は追加の処理が一切必要ないので、setterm は「Device is ASCII」というメッセージを出力して終了します。

続いて setterm は、構成ファイル内の、terminfo(4) エントリの devt フィールドに関連付けられたコマンドを実行します。–t オプションを指定しなかった場合やコマンド行引数が存在しない場合は、一致するエントリが存在しないのでエラーになります。その場合、setterm はエラーメッセージを表示して終了します。

–x オプションを指定した場合、それに続く引数 (NAME) が、構成ファイル内に現れる devt フィールドであるとみなされます。terminfo(4) エントリの検索は行われず、代わりにその引数が使用されます。構成ファイル内の一致するエントリが無条件に実行されるので、–x オプションを使用する際には注意が必要です。–x オプションがもっとも役に立つのは、モジュールをテストする場合や複数の構成を動的に切り替える場合、あるいは特定の devt タイプのデフォルトエントリを上書きする場合です。各ロケールの構成ファイルで登録される devt フィールドは、次のとおりです。

中国語/中華人民共和国ロケール (ロケール名 = "zh")
GenericEUC|EUC

EUC 端末用

ASCII

ASCII 端末用

Error

setterm 実行エラーからの回復用

sane

STREAMS のリセット用

中国語/台湾ロケール (ロケール名 = "zh_TW" / "zh_TW.BIG5")
big5

Big-5 端末用

GenericEUC|EUC

EUC 端末用

ASCII

ASCII 端末用

Error

setterm 実行エラーからの回復用

sane

STREAMS のリセット用

日本語ロケール (ロケール名 = "ja")
JapanPCK|PCK|JapanSJIS|SJIS

PCK (Shift-JIS) 端末用

JapanNewJIS7|NewJIS7

7 ビット新 JIS 端末用

JapanOldJIS7|OldJIS7

7 ビット旧 JIS 端末用

JapanNewJIS8|NewJIS8

8 ビット新 JIS 端末用

JapanOldJIS8|OldJIS8

8 ビット旧 JIS 端末用

GenericEUC|JapanEUC|EUC

EUC 端末用

ASCII

ASCII 端末用

Error

setterm 実行エラーからの回復用

sane

STREAMS のリセット用

日本語ロケール (ロケール名 = "ja_JP.PCK")
JapanPCK|PCK|JapanSJIS|SJIS

PCK (Shift-JIS) 端末用

JapanNewJIS7|NewJIS7

7 ビット新 JIS 端末用

JapanOldJIS7|OldJIS7

7 ビット旧 JIS 端末用

JapanNewJIS8|NewJIS8

8 ビット新 JIS 端末用

JapanOldJIS8|OldJIS8

8 ビット旧 JIS 端末用

GenericEUC|JapanEUC|EUC

EUC 端末用

ASCII

ASCII 端末用

Error

setterm 実行エラーからの回復用

sane

STREAMS のリセット用

韓国語ロケール (ロケール名 = "ko")
KoreanPACK|PACK

圧縮コード端末 (KS C 5601-1987) 用

KoreanJOHAP|JOHAP

組み合わせコード端末 (KS C 5601-1992) 用

GenericEUC|EUC

EUC (Wansung) 端末用

ASCII

ASCII 端末用

Error

setterm 実行エラーからの回復用

sane

STREAMS のリセット用

韓国語ロケール (ロケール名 = "ko.UTF-8")
U8|u8|UTF-8|utf-8

UTF-8 (KS C 5700) 端末用

KoreanU8EUC|KU8EUC

EUC (Wansung) 端末用

KoreanU8JOHAP|KU8JOHAP

組み合わせコード端末 (KS C 5601-1992) 用

GenericEUC|EUC

EUC (Wansung) 端末用 (UTF-8 コード変換なし)

ASCII

ASCII 端末用

Error

setterm 実行エラーからの回復用

sane

STREAMS のリセット用

構成ファイルの内容が正しいことを検証するには、–v オプションを使用します。これは、構成ファイル内のエントリごとにデバッグ出力を表示しますが、アクションは一切実行しません。これは、構成の構文を検証するためにのみ使用されます。

指定した端末の devt フィールドが存在する場合、その値を使って構成ファイル内で対応するエントリの検索が行われます。setterm によって構成ファイル内の行が解析され、アクションが実行されます。

ユーザーの環境に変数 $SETTLIB が含まれている場合は、その変数が、デフォルト構成ファイルの代わりに構成ファイルとして使用すべきファイルのパス名であるとみなされるため、ユーザーごとのカスタマイズが可能となります。

辞書モジュールなどの特殊化された処理機能が必要になる言語の場合、run コマンドを使用することで、ストリームの構築後や適切なモジュールのプッシュ後に適切な ioctl(2) コマンドの送信と特殊目的の (言語依存の) 処理を行うことができます。この目的のために run コマンド経由で実行されるプログラム (一般にsetterm ライブラリ内に存在する) は、初期化プログラムと呼ばれます。

ディストリビューションに含まれる setterm 構成ファイルにはいくつかの例が付属しているので、特に説明がなくても形式を理解できるはずです。「#」で始まる行 (1 行目にある場合のみ) は、コメントとみなされ無視されます。

コマンド言語

setterm のコマンド言語は非常に単純です。構成ファイル内の各エントリは単一の論理行を占有します。改行はバックスラッシュでエスケープできるので、編集がしやすいようにエントリをいくつかの物理行に分散させることができます。各エントリは、識別用のワード (通常は terminfo(4) データベースのdevt エントリに一致) とアクションリストから構成されます。各アクションはスペース (空白、タブ、またはエスケープされた改行) で区切ります。「ワード」は、英数字または特殊印字文字のブロック (スペースや制御文字は一切含まない) として定義されます。

アクションは 1 つのコマンドワードから構成されますが、そのあとに単一の引数ワードが続くこともあります。コマンドワードと引数ワードはコンマかスペースで区切ります。

引数ワードには、空白やタブは一切含めてはいけませんが、コロンやコンマなどの内部区切り文字は含めることができます。

例:

 
          Acceptable:    A=ldterm:eldterm,ld0:eld0
          Unacceptable:  A = ldterm: eldterm , ld0:eld0
     
      

次のコマンドが認識されます。「NAME」、「NAMELIST」、「MOD1」、および「MOD2」はモジュールの名前を示します。「NAMELIST」は、1 つ以上のモジュール名を垂直バー (「|」記号) で区切ったもの (空白は含まない) を示します。「CMD」はシェルコマンド行を示します。「VAR」は単一文字の変数名 (「A」から「F」まで) を示します。「WORDLIST」は、「select」コマンドの特殊なワードリストを示します。

 
               cmd       Arguments           Action(s)

               pop       none                pop one module
               popto     NAMELIST            pop until it encounters one of
                                             modules in NAMELIST or there is no
                                             more to pop
               popall    none                pop all modules
               throw     none                save termio(7) settings
               catch     none                restore termio(7) settings
               push      NAME                push module name
               run       { CMD }             run command line between {}
               set       VAR                 set VAR to name of top module
               if        VAR=NAME?MOD1:MOD2  if the value of VAR is equal
                                             to NAME, then push MOD1, else
                                             push MOD2
               test      VAR=NAME            set VAR to
                                             NAME if the module "NAME" is in the
                                             STREAM
               select    VAR=WORDLIST        test "VAR" against the left
                                             word of each pair in "WORDLIST";
                                             push the first right word that matches
     
      

iftest、および select コマンドではいくつかの特殊ワードが認識されます。それらのワードを次に示します。

 
          END  stop processing and exit
          NUL  do nothing
          POP  pop a module rather than pushing
          ELSE as first of a pair in a WORDLIST,
               match any value including a NULL string
     
      

上で示した if コマンドの引数は、指定した変数の値がリテラルモジュール名「NAME」に一致する場合はアクション「MOD1」が実行され、それ以外の場合はアクション「MOD2」が実行されることを意味しています。代わりのアクションが不要な場合は、コロンと「MOD2」を省略してもかまいません。デフォルトでは、モジュール名のアクションは、そのモジュールをプッシュすることです。モジュール名が特殊名の 1 つである場合、その特殊名に関連付けられたアクションが実行されます。「ELSE」キーワードはtest または if コマンドでは使用できません。END キーワードは、変数のテスト対象の値として使用することはできず、一致した場合に実行するアクションとしてのみ使用できます。

select コマンドの「WORDLIST」は、変数名、等号、そして「WORD.WORD」という形式のワードペアのリストを順に並べたものになります。各ワードペア間はコンマで区切ります。したがって、select コマンドの全体は次のようになります。

select A=eld0:ld0epld:ppld,ELSE:ld0

ELSE」キーワードをペアの右側のワードとして使用することはできず、「END」キーワードをペアの左側のワードとして使用することもできません。「NULL」はどちらでも使用できます。

run コマンドでは例外的に、引数の中括弧の間に空白を含めることができます。run コマンドのアクションは次のようになります。

run { /usr/share/lib/setterm/a_prog an_arg }

run コマンド経由で実行されるコマンドは /usr/share/lib/setterm ディレクトリ内に存在すべきですが、必ずしもそうでなくてもかまいません。これらは、非常に特殊化されたものとして意図されているため、あまりにも多くの引数を必要とすべきではありません。これらは一般に、言語依存処理機能を一切持たないsetterm に代わって、任意のデバイス依存処理や言語依存処理を実行します。

setterm–t オプション付きで呼び出した場合、run コマンド経由で呼び出されプログラムの環境変数 $TERM が、–t オプションの引数に指定された端末名で置き換えられます。

throw コマンドは、ttytermio(7I) 設定を保存します。それらは、(おそらく回線制御手順やその他のモジュールが変更されたあとで) catch コマンド経由で復元できます。これらは回線制御手順を切り替える際に便利です (新旧の回線制御手順が termio(7I) インタフェースをサポートしている場合)。throw の実行前に catch が実行された場合、catch の代わりにコマンド行 stty sane が実行されます (これは、ひどく混乱してしまったストリームを復元する場合に便利)。したがって、throw なしの catch は、run {stty sane} と同等になります。2 つの throw を実行するには、必ず両者の間で catch を 1 つ実行する必要があります。

次の例は、完全なエントリが構成ファイル内でどのように表示されるかを示したものです。

 
          #
          # Japanese 7-bit JIS terminal
          JapanJIS7|JIS7throw\
               popto zs|mcp|mti|ptem\
               push jconv7\
               push ldterm\
               push ttcompat\
               catch
          #
     
      

このエントリは次で呼び出せます。


%  setterm -x JIS7


前述したように、エスケープされた改行が必要になる理由は、各エントリが単一の論理行上に存在する必要があるからです。エスケープされた改行は、単一の空白文字として扱われます。

構成ファイル内の devt ラベルはオプションで、一連のワードを垂直バー (「|」記号) で区切ったもの (空白は含まない) にすることができます。この場合、ファイル内でエントリを検索する際に、setterm によって「|」で区切られたリスト内の各ワードが一致するかスキャンされ、いずれかのワードが一致すればそのエントリが使用されます。

T という追加の変数が存在していますが、これは、set コマンドでの設定時に汎用デバイス名を取ります。この変数の設定時に、setterm によって ttyname(3C) の呼び出しがファイル記述子ゼロで発行されます。結果となるデバイス名から末尾の ASCII 数字 (つまり 0-9) がすべて除去され、その結果が T 変数の値になります。これは、デバイスタイプやドライバごとに特殊化された処理が必要な場合 (コンソールで特殊目的の処理が必要な場合など) に便利です。/dev/tty33 のような実際のデバイス名が、/dev/tty のような名前に変換されます。末尾の数字を含まない名前では数字の除去は行えないので、/dev/console は同じままになります。使用例は次のようになります。

set T select T=/dev/console:this,/dev/tty:that,ELSE:other

制限事項

現在、単一の「アクション」エントリの最大サイズは 2047 バイトに制限されています。「select」リスト内の項目数は 30 に制限されています。残念ながら、setterm を使って多重構成を構築することはできません。多重構成が必要な場合は run コマンドが役に立つ可能性があります。「throw」や「catch」が呼び出されないかぎり、settermtermio(7I) 設定を保存することも復元することもありません。

エラー報告は最小です。エラーはすべて致命的です。モジュールをポップできなくてもエラーになりませんが、それは、STREAM の「最下部」に達したことを意味している可能性があるからです。

構成ファイルは上から順にスキャンされ、特定の devt に対して最初に見つかったエントリのみが実行されます。

警告

エラーはすべて致命的であるため、きわめてひどい端末構成や、ログアウトするしか逃れる方法がないような完全に使いものにならない構成に、ユーザーが放置されてしまう可能性があります。「throw」、「catch」、および適当なトップレベルモジュールの存在のテストは、そうした可能性を減らすのに役立つはずです。新しいエントリをさまざまな条件下で厳格にテストすることをお勧めします。また、–x オプションで使用するための何らかのタイプの「sane」エントリを、構成ファイルに挿入することもお勧めします。

setterm は、端末へのすべての ioctl(2) 呼び出しで標準入力ファイル (ファイル記述子ゼロ) を使用します。したがって、端末がハングアップする場合 (すべてのモジュールをポップしたのに何もプッシュできない場合やあるモジュールでハングアップや障害が発生する場合など)、別の端末 (適切なアクセス権があるものと仮定) から、エラーが発生している端末回線にリダイレクトされた標準入力を使って setterm を実行することができます。たとえば、モジュールに問題があるために tty12 がハングアップする場合、「setterm-x ... < /dev/tty12」とすれば問題が解決するはずです。

setterm を再帰的に呼び出す場合 (つまり、エントリ内から「run { setterm ... }」を実行する場合)、無限再帰に注意してください。setterm は無限再帰を検出できません。

ファイル

/usr/share/lib/setterm

setterm ライブラリ

/usr/share/lib/setterm/locale/conf.file

デフォルトの構成ファイル

/usr/share/lib/setterm/NOTES

形式に関する説明や注意事項

属性

次の属性については、attributes(5) を参照してください。

属性タイプ
属性値
使用条件
system/locale/setterm

関連項目

getty(1M), tic(1M), terminfo(4), streamio(7I), termio(7I)

各種のローカルモジュールに関するドキュメント

バグ

run コマンドの中括弧 (}) の欠落がパーサーによって検出されないことがあります (洗練度が相対的に低い)。このため、構文エラーが検出されないまま、不正な引数がコマンドに渡される可能性があります。