手册页部分 1: 用户命令

退出打印视图

更新时间: 2014 年 7 月
 
 

setterm (1)

名称

setterm - 在 tty 行上构建流

用法概要


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

可用性

可用性

system/locale/extra

描述

setterm 用于在 tty 行上构建 STREAMS 配置。调用 settermstdinstdoutstderr 应全部附加到终端行,虽然只要标准输入连接到终端行时它通常就可以工作。通常对其进行调用时将有一些种类的线路规程已经推送到行上,因为 getty 需要推送可以由登录使用的线路规程。

如果在没有参数的情况下调用,setterm 会在用户的环境中查找 $TERM 变量。如果未找到变量,setterm 将退出,因为它需要 $TERM 信息来执行任何进一步处理。如果为 -t 选项提供了参数,则使用的下一个参数 (TERMNAME) 是终端类型的名称。在 terminfo(4) 数据库中查找终端名称,从该条目中提取字段 devt(如果该字段存在)。如果没有 devt 字段,则假定终端为 ASCII,表示不需要其他处理,然后 setterm 将输出消息 "Device is ASCII"(设备是 ASCII)并退出。

然后,setterm 运行与其 terminfo(4) 条目中的 devt 字段关联的配置文件中的命令。如果未提供 –t 选项,或者没有命令行参数,则没有要匹配的条目是一个错误。在这种情况下,setterm 将退出并显示错误消息。

如果提供了 –x 选项,则使用以下参数 (NAME) 来成为显示在配置文件中的 devt 字段。将不查找 terminfo(4) 条目,转而使用该参数。无条件地执行配置文件中的匹配条目;因此应谨慎使用 –x 选项。对于测试模块以及在配置之间动态切换,或者对于覆盖特定 devt 类型的缺省条目,–x 选项最有用。将在每个语言环境的配置文件中注册以下 devt 字段:

中文/PRC 语言环境(语言环境名称 = "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

用于没有 UTF-8 代码转换的 EUC (Wansung) 终端

ASCII

用于 ASCII 终端

Error(错误)

用于在 setterm 执行时从错误中恢复

sane

用于重置 STREAMS

–v 选项用于验证配置文件的内容是否正确。它输出配置文件中每个条目的调试输出,但是不执行任何操作。它仅用于对配置进行语法验证。

如果给定终端存在 devt 字段,在配置文件中搜索适当条目时将使用该字段的值。将解析配置文件中的行,setterm 将执行操作。

如果用户的环境包含变量 $SETTLIB,将使该变量成为要用作配置文件的文件(而不是缺省配置文件)的路径名,从而允许基于每个用户进行定制。

对于需要字典模块或其他专用处理功能的语言,可以在构建了流后或推送了适当模块后使用 run 命令发送适当 ioctl(2) 命令和执行特殊目的(即语言有关的)处理。通过 run 命令运行来实现此目的程序(通常位于 setterm 库中)称为初始化程序。

在分发时,setterm 配置文件随附了一些示例,格式应该是不言自明的。以 "#" 开头的行(仅在第一列中)应作为注释而忽略。

命令语言

setterm 命令语言非常简单。每个条目在配置文件中占用一个逻辑行。换行符可以使用反斜杠进行转义,从而可以在多个物理行中分配条目,以易于编辑。每个条目包含一个标识词(其通常与 terminfo(4) 数据库的 devt 条目匹配)和一个操作列表。每个操作由空白(空格、制表符或转义的换行符)分隔。“词”定义为字母数字或特殊打印字符的块,不包含空白或控制字符。

操作包含命令词,可能后跟单个参数词。参数词通过逗号或空白与命令词分隔开。

参数词不能包含任何空格或制表符,但是可能具有内部分隔符,例如冒号和逗号。

例如:

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

可以识别以下命令。"NAME"、"NAMELIST"、"MOD1" 和 "MOD2 ",指示模块的名称;"NAMELIST" 指示由竖线("|" 符号)分隔(无空格)的一个或多个模块名称;"CMD" 指示 shell 命令行;"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
     
      

if testselect 命令可以识别一些特殊词。这些词是:

 
          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"。缺省情况下,模块名称的操作是推送该名称。如果模块名称是特殊名称之一,则执行与该特殊名称关联的操作。"ELSE" 关键字不能出现在 testif 命令中。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(其没有语言相关处理功能)执行任何设备或语言相关处理。

如果使用 –t 选项调用 setterm,则通过 run 命令调用的程序会将其环境 $TERM 变量替换为 –t 选项的参数中指示的终端名称。

throw 命令保存 ttytermio(7I) 设置。可以通过 catch 命令恢复(假定在线路规程或其他模块已更改后)这些设置。当旧的和新的线路规程都支持 termio(7I) 接口时,这些设置可用于切换线路规程。如果在前面没有 throw 的情况下执行 catch,将执行命令行 stty sane 而不是 catch(用于恢复非常混乱的流);从而没有 throwcatch 等效于 run{stty sane}。如果两个 throw 之间没有 catch 则不能执行它们。

示例

以下示例显示了配置文件中的完整条目:

 
          #
          # 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

限制

限制

当前,单个 "action" 条目的最大大小限制为 2047 字节。"select" 列表中的项数限制为 30。遗憾的是,setterm 无法用于构建多路复用配置。需要多路复用配置时,run 命令可能会有所帮助。除了通过 "throw" 和 "catch" 执行外,setterm 将既不保存也不恢复 termio(7I) 设置。

错误报告极少;所有错误都是致命错误。无法弹出模块不是错误,因为它可能表示 STREAM 的 "bottom"。

将顺序扫描配置文件,仅执行针对特定 devt 找到的第一个条目。

忠告

忠告

因为所有错误都是致命错误,所以可能会给用户留下非常原始的终端配置或者完全无用的配置,从而用户必须注销。"Throw"、"catch" 和对合理顶级模块是否存在的测试应可以帮助降低这些可能性。建议在各种条件下对新条目进行严格测试。此外,还建议将某种类型的 "sane" 条目插入配置文件以与 –x 选项配合使用。

对于针对终端的所有 ioctl(2) 调用,setterm 使用其标准输入文件(文件描述符零)。因此,如果终端应该挂起(例如,如果所有模块已经弹出但是无法推送任何项,或者在模块挂起或故障时),可以从其他终端(假定有适当权限)运行 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 命令中缺少花括号 (}) 无法由解析器捕获,解析器相对粗略。这样可能导致命令的参数错误,无法捕获语法错误。