te
Copyright (c) 1982-2007 AT&T Knowledge Ventures
To view license terms, see http://www.opensource.org/licenses/cpl1.0.txt
Portions Copyright (c) 2009, 2011, Oracle and/or its affiliates. 保留所有权利。
ksh 1 "2011 年 7 月 9 日" "SunOS 5.11" "用户命令"
名称
ksh, ksh93, rksh - Korn Shell,一种标准和受限的命令与编程语言
用法概要

ksh [\(+-abcefhikmnoprstuvxBCD] [-R file] [ \(+-o option] ...
 [-] [arg ...]

rksh [\(+-abcefhikmnoprstuvxBCD] [-R file] [\(+-o option] ...
 [-] [arg ...]
描述

ksh 是一种执行从终端或文件读取的命令的命令与编程语言。rksh 是命令解释程序 ksh 的受限版本。rksh 用于设置登录名和执行环境,其功能比标准 shell 的功能更受约束。

有关此 shell 的参数的含义,请参见调用

"定义"

元字符定义为下列字符之一:

; & ( ) | < > NEWLINE SPACE TAB

空白制表符空格

标识符是以字母或下划线开头的字母、数字或下划线的序列。标识符用作变量名称的组成部分。

vname 是由句点 (.) 分隔的一个或多个标识符的序列,并且可选择性地在此序列前面添加一个句点 (.)。vname 用作函数和变量名称。

单词是当前语言环境定义的字符集合中的字符的序列(不包括不带引号的元字符)。

命令是 shell 语言的语法中的字符序列。shell 读取各个命令,并直接执行或通过调用单独的实用程序执行所需操作。内置命令是由 shell 自身执行且未创建单独的进程的命令。某些命令用作内置命令的原因仅仅是出于方便,这些命令不在本手册页的论述范围内。本手册页记录了对 shell 环境造成负面影响的内置命令以及在执行路径搜索前发现的内置命令(请参见执行)。出于历史原因,其中的某些内置命令的行为不同于其他内置命令的行为,这些命令称为特殊内置命令。

"Commands(命令)"

简单命令是一个变量赋值的列表(请参见变量赋值),或是一个可在其前面添加变量赋值列表的以空白分隔的单词序列。请参见本手册页的环境部分。

第一个单词指定要执行的命令的名称。除非在此节中指定,否则其余单词将作为参数传递到调用的命令。命令名称作为参数 0 传递。请参见 exec(2)。简单命令的即为其退出状态。如果简单命令正常终止,其值为 0-255。如果简单命令异常终止,其值为 256+signum。与退出状态对应的信号的名称可通过 kill 内置实用程序的 -l 选项获取。

管道是由 | 分隔的一个或多个命令的序列。 每个命令(最后一个命令除外)的标准输出都通过 pipe(2) 连接到下一命令的标准输入。每个命令(可能除最后一个命令以外)都作为单独的进程运行。shell 等待最后一个命令终止。除非启用了 pipefail 选项,否则管道的退出状态即为最后一个命令的退出状态。每个管道前面都可以添加保留字 !。如果最后一个命令的退出状态为非零,此操作会导致管道的退出状态变为 0;如果最后一个命令的退出状态为 0,则会导致管道的退出状态变为 1

列表是由 ;、&、|&、&& 或 | 分隔的一个或多个管道的序列,并且该序列可以选择性地以 ;、&|& 结束。在这五个符号中,;、&|& 的优先级相同,这些符号的优先级低于 &&|| 的优先级。同时,符号 &&|| 也具有相同的优先级。

分号 (;) 导致按顺序执行前面的管道。和符号 (&) 导致异步执行前面的管道,也即,shell 会等待该管道完成。符号 |& 导致异步执行前面的管道,并建立一个到父 shell 的双向管道。通过向命令应用重定向运算符 <& >& 以及 arg p,并通过使用内置命令 readprint-p 选项,父 shell 可以写入和读取派生的管道的标准输入和输出。符号 && (||) 导致仅当前面的管道返回零(非零)值时才会执行该符号后面的列表列表中可显示一个或多个换行符(而非分号)来分隔命令。如果列表的第一个管道的第一个是一个并非以重定向开头且未出现在 whileuntilif 列表中的简单命令,则可以在此项前面添加一个分号。除非使用 set 内置命令按照说明启用 showme 选项,否则将忽略此分号。

命令要么是一个简单命令,要么是以下列表中的命令之一。除非另行说明,否则命令返回的值即为该命令中执行的最后一个简单命令的值。

for vname [ in word ... ] ;do list ;done

每次执行 for 命令时,vname 都会设置为从 in word 列表获取的下一个 word。如果省略了 in word ...for 命令针对每个位置参数执行一次 do list,这些位置参数从 1 开始设置。当此列表中没有任何其他单词时,执行随即结束。请参见参数扩展

(( [expr1] ; [expr2] ; [expr3] )) ;do list ;done

首先计算算术表达式 expr1。反复计算算术表达式 expr2,直到其计算结果为为止;如果计算结果为非零,则会执行 list,并计算算术表达式 expr3。如果省略了任何表达式,该表达式按照计算结果为 1 的方式运行。请参见算术计算

select vname [ in word ... ] ;do list ;done

select 命令在标准错误(文件描述符 2)中输出一组 word,每个 word 前面均带有一个数字。如果省略了 in word...,则改用从 1 开始的位置参数。请参见参数扩展。输出 PS3 提示,并从标准输入中读取一个行。如果此行包含列出的某个 word 的数字,那么变量 vname 的值设置为与该数字对应的 word。如果此行为空,则会重新输出选择列表。否则,变量 vname 的值设置为 null。从标准输入读取的行的内容保存在变量 REPLY 中。在遇到中断符或 EOF 之前,系统会针对每个选择执行 list。如果通过执行 listREPLY 变量设置为 null,则会输出选择列表,然后为下一选择显示 PS3 提示。

case word in [ [(] pattern [ | pattern ] ... ) list ;; ] ... esac

case 命令执行与 word 匹配的第一个 pattern 的关联 list。模式的格式与用于生成文件名的格式相同。请参见文件名生成;; 运算符导致终止执行 case。如果使用 ;& 取代 ;;,则会执行下一个后续列表(如果有)。

if list ;then list [ ;elif list ;then list ] ... [ ;else list ] ;fi

执行 if 后面的 list,并且如果返回退出状态,则执行第一个 then 后面的 list。否则执行 elif 后面的 list,如果其值为,则执行下一个 then 后面的 list。如果执行每个连续的 elif list 失败,则会执行 else list。如果 if list 具有非零退出状态,并且没有 else listif 命令会返回退出状态。

while list ;do list ;done

until list ;do list ;done

while 命令反复执行 while list,并且如果此列表中的最后一个命令的退出状态为零,则会执行do list,否则循环将终止。如果未执行 do list 中的命令,while 命令将返回退出状态,并且可使用 until 替换 while,以便对循环终止测试求反。

((表达式))

使用本手册页中介绍的算术计算规则计算 expression。如果算术表达式的值为非零,退出状态为 0。否则,退出状态为 1

(list;)

在单独的环境中执行 list。如果需要两个相邻的左括号以便进行嵌套,必须插入一个空格以免作为算术命令计算(如本部分所属)。 完全执行 list。与元字符不同的是,() 以及 {}保留字,它们必须出现在行开头或 ; 之后才能识别。

[[ 表达式 ]]

计算 expression 并在 expression 为 True 时返回退出状态。有关 expression 的说明,请参见条件表达式

function varname { list ;}

varname () { list ;}

定义 varname 引用的函数。其 varname 包含 . 的函数称为规程函数,并且最后一个 . 前面的 varname 部分必须引用现有变量。 函数主体是 {} 之间的命令的 list。此外,使用函数 varname 语法定义的函数还可用作 . 特殊内置命令的参数,以便获取使用 varname() 语法定义它的等效行为。请参见函数

time [ pipeline ]

如果省略了 pipeline,则会在标准错误中输出当前 shell 和已完成的子进程的用户和系统时间。否则执行 pipeline,并在标准错误中输出已用时间以及用户和系统时间。TIMEFORMAT 变量可设置为格式字符串,用于指定时间信息的显示方式。有关 TIMEFORMAT 变量的说明,请参见 Shell 变量

下列保留字仅作为命令的第一个字且未带引号时才能识别为保留字:

case

do

done

else

elif

esac

for

fi

function

if

select

then

time

until

while

{ }

[[ ]]

!

"变量赋值"

一个或多个变量赋值可启动简单命令,也可用作 typesetexportreadonly 特殊内置命令的参数。赋值语法格式如下所示:

varname=word

varname[word]=word

禁止在 varname= 之间或者 =word 之间使用空格。

varname=(assignlist)

禁止在 varname= 之间使用空格。assignlist 可以为下列值之一:

word ...

索引数组赋值。

[word]=word ...

关联数组赋值。如果带有 typeset -a 前缀,则改为创建索引数组。

赋值 ...

复合变量赋值。这会创建一个带有子变量的复合变量 varname,子变量的格式为 varname.name,其中 name 是赋值的名称部分。varname 的值包含所有赋值元素。同时,对 varname 的子变量进行的其他赋值也会显示为 varname 的值的一部分。如果未指定 assignmentvarname 则为允许定义后续子元素的复合变量。

typeset [options] assignment ...

嵌套变量赋值。通过用 ; 分隔每个赋值,可以指定多个赋值。前一个值将在赋值之前取消设置。

此外,可以使用 += 替换 = 以表示添加或附加到前一个值。如果将 += 应用到算术类型,word 将作为算术表达式计算,并添加到当前值。如果应用到字符串变量,则会将 word 定义的值附加到当前值。对于复合赋值,不会取消设置前一个值,并且只要类型兼容,新值便会附加到当前值。
"Comments(注释)"

# 开头的单词将导致注释掉或忽略该单词以及换行符之前的所有后续字符。

"别名设置"

如果为各个命令的第一个单词定义了别名,则会使用别名文本替换此单词。别名由任意数目的字符组成,其中不包括元字符、引号字符、文件扩展字符、参数扩展字符、命令替换字符以及 =。替换字符串可包含任何有效的 shell 脚本,其中包括在命令部分中列出的元字符。除正在替换的所有文本以外,将对被替换文本中的各个命令的第一个单词的别名进行测试。如果别名值的最后一个字符为空白,还会检查此别名后的单词以便进行别名替换。

别名可用于重新定义内置命令,但不能用于重新定义在命令部分中列出的保留字。使用 alias 命令可以创建并列出别名,使用 unalias 命令可以删除别名。

别名设置在读取脚本时执行,而不是在执行脚本时执行。为使别名生效,必须在读取引用该别名的命令之前执行 alias 定义命令。下列别名已编译到 shell 中,但是可以取消设置或重新定义这些别名:

autoload='typeset -fu'
command='command '
fc=hist
float='typeset -lE'
functions='typeset -f'
hash='alias -t --'
history='hist -l'
integer='typeset -li'
nameref='typeset -n'
nohup='nohup '
r='hist -s'
redirect='command exec'
source='command .'
stop='kill -s STOP'
suspend='kill -s STOP $$'
times='{ { time;} 2>&1;}'
type='whence -v'
"波浪号替换"

执行别名替换之后,系统将检查每个单词,查看此单词是否以不带引号的波浪号 (~) 开头。要进行波浪号替换,word 还会引用参数扩展的 word 部分。请参见参数扩展

如果满足此条件,则会检查 / 前的单词,确定它是否与口令数据库中的用户名相匹配。如果找到匹配项,~ 及匹配的登录名将替换为匹配用户的登录目录。如果未找到匹配项,原始文本将保留不变。单独的 ~ 或位于 / 之前的 ~ 替换为 $HOME。后跟有 +-~ 分别替换为 $PWD$OLDPWD 的值。

此外,当赋值的值以 ~ 开头以及当 ~ 显示在冒号 (:) 之后时,扩展变量赋值时会尝试替换波浪号。同时,~ 登录名还会以 : 结束。

"命令替换"

前面带有美元符号 ($) 或一对重音符 (``) 的括号所包含的命令的标准输出可用作单词的一部分或整个单词。尾随的换行符将被删除。在第二种格式(已过时)中,在执行命令之前将处理引号中的字符串,以便替换为特殊引号字符。请参见引用

命令替换 $(cat file) 可替换为速度更快的等效 $(<file)。命令替换 $(n<#) 扩展至文件描述符 n 的当前字节偏移。

"算术替换"

前面带有美元符号的双括号所包含的算术表达式 ($((arithmetic_expression))) 替换为双括号中的算术表达式的值。

"进程替换"

仅在支持使用 /dev/fd 目录命名打开文件的 UNIX 操作系统版本上提供进程替换。

<(list)>(list) 格式的每个命令参数都会运行异步连接到 /dev/fd 中的某个文件的进程 list。此文件的名称即为该命令的参数。如果选择采用 > 的格式,在此文件中写入会为 list 提供输入。如果采用 <,作为参数传递的文件则包含 list 进程的输出。

例如,

paste <(cut -f1 file1) <(cut -f3 file2) | tee \e
 >(process1) >(process2)

分别对文件 file1file2 中的字段 1 和 3 执行 cut 操作,将结果 paste 在一起,并将其发送到进程 process1process2。该命令还会向标准输出显示此结果。作为参数传递给命令的文件为 UNIX pipe(2)。需要对此文件执行 lseek(2) 的程序无法运行。

"参数扩展"

参数是一个变量、一个或多个数字或 *@#?-$! 中的任意字符。变量通过 vname 表示。要创建其 vname 包含 . 的变量,必须已存在一个如下变量:其 vname 在最后一个 . 之前包括所有内容。变量具有一个值以及零个或多个属性。通过使用 typeset 特殊内置命令,可以为变量分配值和属性。后文介绍了 shell 支持的属性以及 typeset 特殊内置命令。导出的变量向环境传递值和属性。

此 shell 支持索引数组和关联数组。数组变量的元素由下标引用。索引数组的下标通过 [] 之间的算术表达式表示(请参见算术计算)。使用 set -A vname value ... 为索引数组分配值。所有下标的值必须介于范围 01,048,575 之间。索引数组不需要声明。对带有有效下标的变量的任何引用都是合法的,并且会根据需要创建数组。

关联数组使用 typeset-A 选项创建。关联数组的下标通过包含在 [] 之间的字符串表示。

引用不带下标的任何数组与引用带有下标 0 的数组等效。

变量的值可通过以下命令分配:

vname=value [vname=value] ...

vname[subscript]=value [vname[subscript]=value] ...

禁止在 = 前后使用空格。nameref 是一个引用其他变量的变量。nameref 使用 typeset-n 属性创建。执行 typeset 命令时的变量值成为使用 nameref 变量时引用的变量。nameref 的名称不能包含点 (.)。如果变量或函数名称包含 .,并且第一个 . 前的名称部分与 nameref 的名称匹配,通过将 nameref 部分替换为 nameref 引用的变量名称可以获取引用的变量。如果将 nameref 用作 for 循环的索引,则会为列表中的每一项建立一个名称引用。nameref 提供了一种在函数中引用变量的方便方法,该变量的名称作为参数传递给函数。例如,如果变量名称作为第一个参数传递给函数,该函数中的命令

 typeset -n var=$1

导致将 var 的引用和赋值作为其名称已传递给函数的变量的引用和赋值。如果为 vname 设置了浮点值属性 -E-F 或者整数属性 -i,该 value 则受算术计算的约束,如本手册页所述。位置参数是通过数字表示的参数,可使用 set 特殊内置命令向这些参数分配值。当调用 shell 时,参数 $0 从参数零开始设置。字符 $ 用于引入可替换的参数。

${parameter}

此 shell 读取从 ${ 到匹配的 } 之间的所有字符,并将其作为同一个单词的一部分,即使此部分包含花括号或元字符。该参数的值(如果有)将被替换。当 parameter 后跟有不会作为其名称的一部分解释的字母、数字或下划线时,当变量名称包含 . 时或者当变量带有下标时,都需要使用花括号。如果 parameter 是一个或多个数字,该参数则为位置参数。包含多个数字的位置参数必须包含在花括号中。如果 parameter*@,则会替换从 $1 开始的所有位置参数,并使用字段分隔符分隔这些参数。如果使用带有下标 *@ 的数组 vname,则会替换每个元素的值,并使用 IFS 的值的第一个字符分隔这些值。

${#parameter}

如果 parameter*@,则会替换位置参数的数字。否则替换 parameter 的值的长度。

${#vname[*]}

${#vname[@]}

替换数组 vname 中的元素数目。

${!vname}

扩展至 vname 引用的变量的名称。除非 vname 为名称引用,否则为 vname

${!vname[subscript]}

除非 subscript*@,否则扩展至下标的名称。当 subscript* 时,生成 vname 的数组下标的列表。对于不是数组的变量,如果设置了该变量,则值为 0。否则为 null。当 subscript@ 时,该命令与 $ {vname[ *]} 相同,除非用于双引号中,此时,每个数组下标将生成一个单独的参数。

${!prefix*}

扩展至其名称以 prefix 开头的变量的名称。

${parameter:-word}

如果 parameter 已设置且不为 Null,则替换其值。否则替换 word。 除非将 word 用作被替换的字符串,否则不会计算它的值。 在下面的示例中,仅当 d 未设置或者为 NULL 时,才会执行 pwd

print ${d:-$(pwd)}
如果表达式中省略了冒号 (:),此 shell 仅检查是否设置了 parameter

${parameter:offset:length}

${parameter:offset}

扩展至 parameter 的值的以下部分:从作为算术表达式扩展偏移量所确定的字符开始(从 0 开始算起),并且该部分包含的字符数由 length 定义的算术表达式确定。 在第二种格式中,使用相应值的剩余部分。负偏移量从 parameter 末尾开始往后计数。 减号前需要一个或多个空白,以免此 shell 将此运算符解释为 :-。如果 parameter 为 *@,或者为 *@ 索引的数组名称,offsetlength 分别表示数组索引和元素数目。相对于索引数组的最高下标而言,采用的负 offset 比此最高下标大 1。未指定关联数组的顺序。

${parameter#pattern}

${parameter##pattern}

如果 shell patternparameter 的值的开头匹配,此扩展的值即为删除了匹配部分的 parameter 的值。否则会替换此 parameter 的值。在第一种格式中,删除了最小匹配 pattern,在第二种格式中,删除了最大匹配 pattern。如果 parameter@*,或者为带有下标 @* 的数组变量,则会依次对每个元素应用求子串操作。

${parameter%pattern}

${parameter%%pattern}

如果 shell patternparameter 的值的末尾匹配,此扩展的值即为删除了匹配部分的 parameter 的值。否则会替换 parameter 值。在第一种格式中,删除了最小匹配 pattern,在第二种格式中,删除了最大匹配 pattern。如果 parameter 为 @*,或者为带有下标 @* 的数组变量,则会依次对每个元素应用求子串操作。

${parameter/pattern/string}

${parameter// pattern/string}

${parameter/#pattern/string}

${parameter/%pattern/string}

扩展 parameter,并使用指定 string 替换 pattern 的最长匹配项。string 中的 \en 的每个匹配项都替换为与第 n 个子模式匹配的 parameter 部分。 如果 string 为 null,则会删除 pattern,并且可省略 string 前面的 /。如果 parameter@*,或者为带有下标 @* 的数组变量,则会依次对每个元素应用替换操作。此种情况下,将针对每个元素重新计算 wordstring 部分。 在第一种格式中,仅替换 pattern 的第一个匹配项。 在第二种格式中,pattern 的每个匹配项都将替换为指定 string。 第三种格式将模式匹配限制为 string 的开头。 第四种格式将模式匹配限制为 string 的末尾。

shell 自动设置下列参数:

#

位置参数的数目(以十进制表示)。

-

在调用时或通过 set 命令向 shell 提供的选项。

?

执行的最后一个命令所返回的十进制值。

$

此 shell 的进程数。

_

一开始时,_ 的值是在环境中传递时所执行的 shell 或脚本的绝对路径名。然后会为该值分配上一命令的最后一个参数。 对于异步命令,未设置此参数。此参数还可用于保存查看邮件时的匹配 MAIL 文件的名称。

!

调用的最后一个后台命令的进程数或使用 bg 内置命令放置到后台的最新作业。

.sh.command

当处理 DEBUG 陷阱时,此变量包含即将运行的最新命令行。

.sh.edchar

此变量包含处理 KEYBD 陷阱时已输入的键盘字符(如果第一个字符为 ESC、ASCII 033,则为字符序列)的值。如果在陷阱操作中更改了此值,则会使用新值替换导致此陷阱的键(或键序)。请参见本手册页的键绑定部分。

.sh.edcol

执行最新的 KEYBD 陷阱时光标所在的字符位置。

.sh.edmode

当在 vi 插入模式下处理 KEYBD 陷阱时,该值设置为 ESC。否则,当处理 KEYBD 陷阱时,.sh.edmode 为 null。请参见本手册页的 vi 编辑模式部分。

.sh.edtext

执行最新的 KEYBD 陷阱时输入缓冲区中的字符。如果未在处理 KEYBD 陷阱,该值则为 null。

.sh.file

包含当前命令的文件的路径名。

.sh.fun

正在执行的当前函数的名称。

.sh.match

将最新匹配项及子模式匹配项存储在匹配的条件模式匹配项以及使用运算符 #%/ 的变量扩展之后的索引数组。第 0 个元素存储完整匹配项,第 i 个元素存储第 i 个子匹配项。当为扩展的变量分配了新值时,.sh.match 变量将取消设置。

.sh.name

设置为调用规程函数时的变量的名称。

.sh.subscript

设置为调用规程函数时的变量的名称下标。

.sh.subshell

子 shell 和命令替换的当前深度。

.sh.value

设置为调用 set 或 append 规程函数时的变量的值。

.sh.version

设置为标识此 shell 的版本的值。

LINENO

正在执行的脚本或函数中的当前行号。

OLDPWD

cd 命令设置的早期工作目录。

OPTARG

getopts 内置命令处理的最后一个选项参数的值。

OPTIND

getopts 内置命令处理的最后一个选项参数的索引。

PPID

shell 的父级的进程数。

PWD

cd 命令设置的当前工作目录。

RANDOM

每次引用此变量时,将生成一个在 032767 之间统一分布的随机整数。通过为 RANDOM 分配一个数值,可以初始化随机数字的序列。

REPLY

如果未提供参数,此变量则由 select 语句和 read 内置命令设置。

SECONDS

每次引用此变量时,将返回自调用 shell 以来所经过的秒数。如果为此变量分配了一个值,引用时返回的值即为此分配的值以及自分配以来所经过的秒数。

shell 使用下列变量:

CDPATH

定义 cd 命令的搜索路径。

COLUMNS

定义 shell 编辑模式的编辑窗口以及用于输出选择列表的编辑窗口的宽度。

EDITOR

如果未设置 VISUAL 变量,则会按照 VISUAL 的说明针对模式检查此变量的值,并启用相应的编辑选项。 请参见本手册页特殊命令部分中的 set 命令。

ENV

对相应值执行参数扩展、命令替换和算术替换,以便生成调用 shell 时所执行的脚本的路径名。此文件通常用于别名和函数定义。缺省值为 $HOME/.kshrc。 请参见本手册页的调用部分。 shell 不会设置 ENV

FCEDIT

hist 命令的缺省编辑器名称的已过时名称。如果设置了 HISTEDIT,则不会使用 FCEDIT。 shell 指定 FCEDIT 的缺省值。

FIGNORE

定义执行文件名匹配时忽略的文件名集的模式。

FPATH

函数定义的搜索路径。当引用具有 -u 属性的函数时,以及当未找到命令时,系统会在此路径中的目录内搜索其名称与此函数或命令相同的文件。 如果找到名称与此命令对应的可执行文件,则会在当前环境中读取和执行此文件。与 PATH 不同的是,必须明确使用句点 (.)(而非相邻冒号 (:) 字符,或者起始或结束冒号 (:))表示当前目录。

HISTCMD

历史文件中的当前命令的数目。

HISTEDIT

hist 命令的缺省编辑器的名称。

HISTFILE

如果在调用 shell 时设置了此变量,此变量的值即为存储命令历史所使用的文件的路径名。请参见本手册页的重新输入命令部分。

HISTSIZE

如果在调用 shell 时设置了此变量,此 shell 可访问的以前输入的命令的数目则大于或等于此数目。缺省值为 512

HOME

cd 命令的缺省参数(起始目录)。 shell 不会设置 HOMEHOMElogin(1) 设置。

IFS

内部字段分隔符,通常为空格、制表符和换行符,这些分隔符用于分隔命令替换或参数扩展的结果,还可用于通过内置命令 read 分隔字段。IFS 变量的第一个字符用于分隔参数以便进行 "$*" 替换。请参见本手册页的引用部分。 要分隔的字符串中出现的、未包含在 issspace 字符类中的每个 IFS 字符以及包含在 issspace 字符类中的 IFS 中的任何相邻字符均可用于分隔字段。IFS 中包含在 issspace 字符类中的一个或多个字符可用于分隔字段。此外,如果 IFS 中连续显示同一 issspace 字符,则会按照此字符不包含在 issspace 类中的方式来处理此字符,因此,如果 IFS 包含两个制表符,两个相邻制表符可分隔一个 null 字段。 shell 指定 IFS 的缺省值。

LANG

对于并非使用以 LC_LANG 开头的变量专门选择的任何类别,此变量确定这些类别的语言环境类别。

LC_ALL

此变量覆盖 LANG 变量以及任何其他 LC_ 变量的值。

LC_COLLATE

此变量确定字符整理信息的语言环境类别。

LC_CTYPE

此变量确定字符处理函数的语言环境类别。它确定用于模式匹配的字符类。请参见本手册页的文件名生成部分。

LC_NUMERIC

此变量确定小数点字符的语言环境类别。

LINES

如果设置了此变量,则使用此变量的值确定列长度以便输出选择列表。选择列表纵向输出,直到填充了大约 2/3 的 LINES 行为止。

MAIL

如果此变量设置为邮件文件的名称,并且未设置 MAILPATH 变量,shell 则会在指定文件中通知用户已收到邮件。 shell 不会设置 MAIL。在某些系统中,MAILlogin(1) 设置。

MAILCHECK

指定 shell 检查 MAILPATHMAIL 变量指定的所有文件的修改时间更改的频率(秒)。缺省值为 600 秒。经过此时间后,shell 会在发出下一提示前进行检查。 shell 指定 MAILCHECK 的缺省值。

MAILPATH

以冒号 (:) 分隔的文件名列表。如果设置了此变量,shell 会通知用户在最后 MAILCHECK 秒内对指定文件所做的任何修改。每个文件名后面都可以带有 ? 以及输出的消息。此消息会进行参数扩展、命令替换和算术替换,并将变量 $_ 定义为已发生更改的文件的名称。缺省消息为在 $_ 中您有一个邮件

PATH

命令的搜索路径。除非在 .profile 中,否则用户无法在 rksh 下执行时更改 PATH。请参见本手册页的执行部分。 shell 指定 PATH 的缺省值。

PS1

扩展此变量的值,以便进行参数扩展、命令替换和算术替换,从而定义主提示字符串,缺省情况下,主提示字符串为 $。主提示字符串中的字符 ! 替换为命令编号。当输出提示字符串时,出现的两个连续 ! 可生成一个 !。请参见本手册页的重新输入命令部分。 shell 指定 PS1 的缺省值。

PS2

辅助提示字符串,缺省情况下为 >。 shell 指定 PS2 的缺省值。

PS3

在选择循环中使用的选择提示字符串,缺省情况下为 #?。 shell 指定 PS3 的缺省值。

PS4

扩展此变量的值,以便进行参数计算、命令替换和算术替换,并且此变量的值会在每一行前面放置一个执行跟踪。缺省情况下,PS4+。如果取消设置 PS4,执行跟踪提示同样为 +。 shell 指定 PS4 的缺省值。

SHELL

在环境中保存 shell 的路径名。如果此变量的根基名称在调用时为 rshrkshrkshkrsh,此 shell 即受限制。 shell 不会设置 SHELL。在某些系统中,SHELLlogin(1) 设置。

TIMEFORMAT

此参数的值用作格式字符串,指定带有 time 保留字前缀的管道的时间信息的显示方式。% 字符引入扩展为时间值或其他信息的格式序列。 格式序列及其含义如下所示。

%%

字符 %

%[p][l]R

已用时间(秒)。

%[p][l]U

在用户模式下所用的 CPU 秒数。

%[p][l]S

在系统模式下所用的 CPU 秒数。

%P

CPU 百分比,计算公式为 (U + S)/R

花括号表示可选部分。可选 p 是一个用于指定精度(即小数点后面的小数位数)的数字。值为 0 导致不会输出小数点或小数。最多可显示小数点后面的三个数位。大于 3p 值视为 3。如果未指定 p,则使用值 3。 可选 l 指定较长的格式,其中包括小时(如果大于零)、分钟和秒钟,并且格式为 HHhMMmSS.FFsp 的值确定是否包含小数。 所有其他字符在输出时都不会发生任何更改,并且会添加一个尾随的换行符。如果取消设置,则使用缺省值 $'\nreal\t%2lR\nuser\t%2lU\nsys%2lS'。如果值为 null,则不会显示时间信息。

TMOUT

如果设置为大于零的值,TMOUT 即为 read 内置命令的缺省超时值。如果输入来自于终端,select 复合命令则会在 TMOUT 秒后终止。否则,当从终端读取时,如果未在规定的秒数内输入某个行,shell 将终止。可以为 shell 编译此值的最大限制,不能超过此最大限制。 shell 指定 TMOUT 的缺省值。

VISUAL

如果此变量的值与模式 *[Vv][Ii]* 匹配,则会启用 vi 选项。请参见特殊命令。如果此值与模式 *gmacs* 匹配,则会启用 gmacs 选项。如果此值与模式 *macs* 匹配,则会启用 emacs 选项。VISUAL 的值会覆盖 EDITOR 的值。

"字段分隔"

执行参数扩展和命令替换之后,系统将扫描替换结果中的字段分隔符(即位于 IFS 中的字段分隔符),并在找到此类字符的位置将结果分隔为不同字段。系统将保留显式 null 字段(""''),并删除隐式 null 字段,这些字段是由没有任何值的参数或没有任何输出的命令替换所生成的。

如果设置了 braceexpand (-B) 选项,则会检查由 IFS 生成的每个字段,以查看它们是否包含一个或多个花括号模式。有效花括号模式包括:{*,*}{ l1..l2}{n1..n2}{n1..n2 %fmt}、{n1.. n2 ..n3}{n1.. n2 ..n3%fmt},其中 * 表示任意字符,l1l2 表示字母,n1n2n3 表示带符号的数字,fmt 表示 printf 使用的指定格式。在每种情况下,通过将 { 前的字符放置在 {} 之间的字符所生成的每个字符串之前,并将 } 后的字符附加到此类字符串之后来创建字段。系统将检查生成的字段,查看这些字段是否包含任何花括号模式。

在第一种格式中,将为 {,,, 以及 , 和 } 之间的每个字符串创建一个字段。* 表示的字符串可包含不带引号的匹配的嵌入式 { 和 }。否则,必须引用带有 * 的每个 {}

在第二种格式中,l1l2 在 C 语言环境中必须同时为大写字母或小写字母字符。在此种情况下,将为从 l1l2 的每个字符创建一个字段。

在其余的格式中,将为从 n1 开始的每个数字创建一个字段。此操作将持续进行,直到达到 n2 并使 n1 递增 n3 为止。如果 n1<=n2,在未指定 n3 的情况下的行为就像 n3 为 1 一样,否则则像 n3 为 -1 一样。在指定了 %fmt 的格式中,可指定所有格式标志、宽度和精度,并且 fmt 可以任何说明符 cdiouxX 结尾。例如,{a,z}{1..5..3%02d}{b..c}x 扩展为 8 个字段,即 a01bx、a01cx、a04bx、a04cx、z01bx、z01cx、z04bxz4cx

"文件名生成"

分隔之后,除非设置了 -f 选项,否则将扫描每个字段,以查看是否包含字符 *?([。如果显示其中的某个字符,则会将单词视为模式。

包含任何模式字符的每个文件名组件都会替换为与该目录中的模式相匹配的按字典顺序排序的名称集合。如果未找到与此模式匹配的文件名,该文件名组件将保持不变,除非此模式带有 ~(N) 前缀,此种情况下,将删除此文件名组件。如果设置了 FIGNORE,当生成匹配的文件名时,将忽略与 FIGNORE 的值定义的模式相匹配的每个文件名组件。此外,还会忽略名称 . ..。如果未设置 FIGNORE,则会忽略每个文件名组件开头的字符 .,除非与此组件对应的模式的第一个字符为字符 . 自身。对于模式匹配的其他使用情况,不会对 /. 进行特殊处理。

*

匹配任何字符串,包括 null 字符串。当用于文件名扩展时,如果启用了 globstar 选项,单独的两个相邻 * 匹配所有文件和零个或多个目录及子目录。如果两个相邻 * 后跟有一个 /,则仅匹配目录和子目录。

?

匹配任何单个字符。

[...]

匹配包括的任何一个字符。使用 - 分隔的一对字符将在词汇上匹配这对字符之间的任何字符,包括这对字符。如果左 [ 后面的第一个字符为 !,则匹配任何不包括的字符。通过将 - 作为第一个或最后一个字符,可以将其包含在字符集合中。在 [] 中,可使用语法 [:class:] 指定字符类,其中 class 表示按 ANSI-C 标准定义的下列类之一:

alnum alpha blank cntrl digit graph
lower print punct space upper
word xdigit
word 等效于 alnum 和字符 _。在 [] 中,可使用语法 [=c=] 指定等效类,这会匹配主整理权重(根据当前语言环境定义)与字符 c 相同的所有字符。在 [] 中,[.symbol.] 匹配整理符号 symbol

pattern-list 是使用 &| 彼此分隔的一个或多个模式的列表。 & 表示必须匹配所有模式,而 | 要求仅匹配一个模式。复合模式可以由下列一个或多个子模式组成:

?(pattern-list)

选择性地匹配任何指定模式之一。

*(pattern-list)

匹配出现的零个或多个指定模式。

+(pattern-list)

匹配出现的一个或多个指定模式。

{n(pattern-list)

匹配出现的 n 个指定模式。

{m,n(pattern-list)

匹配出现的 mn 个指定模式。如果省略了 m,则使用 0。如果省略了 n,则至少匹配出现的 m 个指定模式。

@(pattern-list)

与某个指定模式完全匹配。

!(pattern-list)

与除某个指定模式以外的所有内容匹配。

缺省情况下,每个模式或子模式匹配最长的字符串,此字符串可能与生成最长的完整匹配项相一致。如果可能有多个匹配项,则选择起始位置离字符串开头最近的匹配项。但是,对于每个复合模式,可以在 ( 前面插入一个 -,以便使用指定 pattern-list 的最短匹配项。

如果 pattern-list 包含在括号中,则会以特殊方式处理反斜杠字符 \e,即使它位于字符类中也是如此。所有 ANSI-C 转义符均可识别,并且与指定字符匹配。此外,还可识别下列转义序列:

\ed

匹配数字类中的任意字符。

\eD

匹配数字类中不包括的任意字符。

\es

匹配空格类中的任意字符。

\eS

匹配空格类中不包括的任意字符。

\ew

匹配单词类中的任意字符。

\eW

匹配单词类中不包括的任意字符。

格式为 %(pattern-pairs) 的模式是可用于匹配嵌套字符表达式的子模式。每个 pattern-pair 都是一个包含两个字符的序列,该序列不能包含 &|。第一个 pattern-pair 指定匹配项的起始字符和结束字符。每个后续 pattern-pair 表示在计算起始字符和结束字符匹配项数目时跳过的嵌套组的起始字符和结束字符。如果 pattern-pair 的第一个字符是除下列字符以外的字母数字,则行为是未指定的:

D

导致结束字符在未找到匹配项的情况下终止对此模式的搜索。

E

导致将结束字符解释为转义符。

L

导致将结束字符解释为引号字符,从而导致在查找匹配项时忽略所有字符。

Q

导致将结束字符解释为引号字符,从而导致在查找匹配项时忽略除任何转义符以外的所有字符。

%({}Q"E\e) 匹配从 { 开始的字符,直到找到匹配的 } 为止(位于双引号字符串中或前面带有转义符 \e 的任何 {} 不会计算在内)。如果没有 {},此模式则与任何 C 语言字符串匹配。

复合模式中的每个子模式都根据 ( 在此模式中的位置从 1 开始进行编号。序列 \en(其中 n 表示一个数字,并且 \e n 位于第 n 个子模式之后)匹配与子模式自身相同的字符串。

模式可包含 ~(options:pattern-list) 格式的子模式,其中可省略 options:pattern-list。与其他复合模式不同的是,这些子模式不会计算在带有编号的子模式之内。如果存在 options,则可以包括下列一个或多个字符:

+

启用下列选项。这是缺省值。

-

禁用下列选项。

E

模式的提示使用扩展的正则表达式语法,例如,egrep(1) 命令。

F

模式的提示使用 fgrep(1) 表达式语法。

g

归档最长匹配项(最长一致)。 这是缺省值。

G

模式的提示使用基本正则表达式语法,例如,grep(1) 命令。

i

将匹配项视为不区分大小写。

K

模式的提示使用 shell 模式语法。 这是缺省值。

l

将模式固定在左侧。 这是 K 样式模式的缺省值。

N

忽略此字符。但是,如果该字符是第一个字母,用于生成文件名,并且没有匹配项,则文件模式将扩展为空字符串。

r

将模式固定在右侧。 这是 K 样式模式的缺省值。

如果同时指定了 options:pattern-list,这些选项仅适用于 pattern-list。否则,这些选项将保持有效,直到由后续 ~(...) 禁用或位于含有 ~(...) 的子模式的末尾为止。

"引用"

定义中列出的每个元字符都对 shell 具有特殊意义。

g

归档最长匹配项(最长一致)。这是缺省值。

i

将匹配项视为不区分大小写。

如果同时指定了 options:pattern-list,这些选项仅适用于 pattern-list。否则,这些选项将保持有效,直到由后续 ~(...) 禁用或位于含有 ~(...) 的子模式的末尾为止。

本手册页定义部分中列出的每个元字符都对 shell 具有特殊意义,并且会导致单词结束(除非这些元字符带有引号)。通过在字符前面添加一个反斜杠 (\e),可以引用此字符,即,使此字符代表其自身。\e换行符对将被删除。前面没有 $ 的单引号对 ('') 中包含的所有字符将被引起来。单引号无法显示在单引号中。如果单引号前面带有不带引号的 $,单引号中的字符串将作为 ANSI-C 字符串处理,但下列字符串除外:

\e0

导致忽略字符串的提示。

\ecx

扩展至字符 CTRL-x。

\eC[.name.]

扩展至整理元素 name

\ee

等效于转义符 (ASCII 033)。

\eE

等效于转义符 (ASCII 033)。

参数和命令替换在双引号 ("") 中执行,并且 \e 引用字符 \e`"$。在 CPOSIX 语言环境中,将忽略带有双引号的字符串前面的 $,在其他语言环境中,这可能导致将此字符串替换为语言环境特定的字符串。当未带有引号时,或者当用作变量赋值的值或文件名时,$* 的含义与 $@ 相同。但是,当用作命令参数时,"$*" 等效于 "$1d$2d...",其中 d 表示 IFS 变量的第一个字符,而 "$@" 等效于 "$1" "$2" ....在重音符引号 (``) 中,\ 引用字符 \e`$。如果重音符引号出现在双引号中,\e 还会引用字符 "

通过引用保留字的任何字符,可以删除保留字或别名的特殊意义。函数名称或内置命令名称的识别方式无法通过引用它们来进行更改。

"算术计算"

此 shell 通过执行算术计算来进行算术替换,以便计算算术命令、索引数组下标以及内置命令 shiftlet 的参数。此外,还会对内置命令 printf 的参数操作数执行算术计算,该命令与格式操作数中的数字格式说明符相对应。请参见 printf(1)。使用双精度浮点运算或长整型双精度浮点数对提供此数据类型的系统执行计算。浮点常量遵循 ANSI-C 编程语言浮点约定。整数常量遵循 ANSI-C 编程语言整数常量约定,但只能识别单字节字符常量,而不能识别字符强制类型转换。常量可以采用 [base#]n 格式,其中 base 是介于 2 到 64 之间的表示算术基的十进制数字,n 是该基中的数字。大于 9 的数字分别通过小写字母、大写字母、@_ 表示。对于小于或等于 36 的基,可以交替使用大写和小写字符。

算术表达式使用与 C 语言相同的表达式语法、优先级和关联。所有适用于浮点值的 C 语言运算符均可使用。此外,运算符 ** 可用于求幂。同乘法相比,它具有较高的优先级,并且会保留关联性。如果算术变量或子表达式的值可表示为长整数,则可以执行所有 C 语言整数算术运算。算术表达式中的名称可引用变量,而不必使用参数扩展语法。引用变量时,该变量的值将作为算术表达式计算。

C 数学库包含的下列任何数学库函数均可在算术表达式中使用:

abs acos acosh asin asinh atan atan2 atanh cbrt 
copysign cos cosh erf erfc exp exp2 expm1 fabs
fdim finite floor fma fmax fmod hypot ilogb 
int isinf isnan lgamma log log2 logb 
nearbyint nextafter nexttoward pow remainder
rint round sin sinh sqrt tan tanh tgamma trunc

使用 typeset 特殊内置命令的 -E [n]-F [n] 选项可以指定作为双精度浮点数的变量的内部表示。-E 选项导致在扩展值时使用科学记数法表示此值的扩展。可选选项参数 n 定义重要数字的数目。-F 选项导致在扩展时将扩展表示为十进制浮点数。此种情况下,可选选项参数 n 定义小数点后面的小数位数。

使用 typeset 特殊内置命令的 -i [n] 选项可以指定变量的内部整数表示。可选选项参数 n 指定扩展变量时使用的算术基。如果未指定算术基,则使用基 10。

使用 -E-F-i 选项对变量的每个赋值的值执行算术计算。向整数类型的变量分配浮点数会导致截断小数部分。

"提示"

当交互使用时,shell 在扩展 PS1 以便进行参数扩展、命令替换和算术替换之后通过 PS1 的值进行提示,然后再读取命令。此外,提示中的每个 ! 都会替换为命令编号。A !!才能在提示中放置 !。如果在任何时间键入了换行符,并且需要进行更多输入才能完成命令,则会发出辅助提示,即 PS2 的值。

"条件表达式"

条件表达式[[ 复合命令配合使用,以便测试文件属性和比较字符串。不会对 [[]] 之间的单词执行字段分隔和文件名生成。

每个表达式均可由下面的一个或多个一元表达式或二元表达式构成:

-a file

True(如果 file 存在)。 此选项与 -e 相同。此选项已过时。

-b file

True(如果 file 存在且为块特殊文件)。

-c file

True(如果 file 存在且为字符特殊文件)。

-d file

True(如果 file 存在且为目录)。

-e file

True(如果 file 存在)。

-f file

True(如果 file 存在且为普通文件)。

-g file

True(如果 file 存在且设置了其 setgid 位)。

-G file

True(如果 file 存在,并且其组与此进程的有效组 ID 匹配)。

-h file

True(如果 file 存在且为符号链接)。

-k file

True(如果 file 存在且设置了其 sticky 位)。

-L file

True(如果 file 存在且为符号链接)。

-n string

True(如果 string 的长度为非零)。

-N file

True(如果 file 存在,并且修改时间大于上次访问时间)。

-o option

True(如果已启用名为 option 的选项)。

-o ?option

True(如果名为 option 的选项为有效选项名称)。

-O file

True(如果 file 存在,并且归此进程的有效用户 ID 所有)。

-p file

True(如果 file 存在且为 FIFO 特殊文件或管道)。

-r file

True(如果 file 存在,并且可供当前进程读取)。

-s file

True(如果 file 存在且其大小大于零)。

-S file

True(如果 file 存在且为套接字)。

-t fildes

True(如果文件描述符编号 fildes 已打开且与终端设备相关联)。

-u file

True(如果 file 存在且设置了其 setuid 位)。

-w file

True(如果 file 存在,并且可供当前进程写入)。

-x file

True(如果 file 存在,并且可供当前进程执行)。如果 file 存在且为目录,并且如果当前进程有权在此目录中搜索,则为 True。

-z string

True(如果 string 的长度为零)。

file1 -ef file2

True(如果 file1file2 存在,并且引用同一文件)。

file1 -nt file2

True(如果 file1 存在且 file2 不存在,或者 file1file2 更新)。

file1 -ot file2

True(如果 file2 存在且 file1 不存在,或者 file1file2 更旧)。

string

True(如果 string 不为 null)。

string == pattern

True(如果 stringpattern 匹配)。可引用 pattern 的任何部分,以将其作为字符串匹配。成功匹配 pattern 后,.sh.match 数组变量将包含匹配项和子模式匹配项。

string = pattern

== 相同,但已过时。

string != pattern

True(如果 stringpattern 不匹配)。如果 stringpattern 匹配,.sh.match 数组变量将包含匹配项和子模式匹配项。

string =~ ere

True(如果 string 与模式 ~(E)ere 匹配,其中 ere 是扩展的正则表达式)。

string1 < string2

True(如果根据字符的 ASCII 值,string1 位于 string2 之前)。

string1 > string2

True(如果根据字符的 ASCII 值,string1 位于 string2 之后)。

在下列每个表达式中,如果 file 格式为 /dev/fd/n(其中 n 为整数),测试则应用于描述符编号为 n 的打开文件。支持下列已过时的算术比较:

exp1 -eq exp2

True(如果 exp1 等于 exp2)。

exp1 -ge exp2

True(如果 exp1 大于或等于 exp2)。

exp1 -gt exp2

True(如果 exp1 大于 exp2)。

exp1 -le exp2

True(如果 exp1 小于或等于 exp2)。

exp1 -lt exp2

True(如果 exp1 小于 exp2)。

exp1 -ne exp2

True(如果 exp1 不等于 exp2)。

通过使用下列任何基元,可以使用这些基元构成复合表达式(这些基元按优先级的降序顺序列出):

(表达式)

True(如果 expression 为 True)。用于对表达式进行分组。

! 表达式

True(如果 expression 为 False)。

expression1 && expression2

True(如果 expression1expression2 均为 True)。

expression1 || expression2

True(如果 expression1expression2 为 True)。

"输入和输出"

执行命令之前,使用 shell 解释的特殊表示法可以重定向该命令的输入和输出。以下内容可显示在简单命令中的任意位置,也可以位于命令之前或之后,并且会传递给调用的命令。除非此部分另行说明,否则在使用 worddigit 之前执行命令替换、参数扩展和算术替换。仅当 shell 为交互式 shell 并且模式与某个文件匹配时,才会执行文件名生成。不会执行字段分隔。

在下列每个重定向中,如果 file 格式为 /dev/sctp/host/port/dev/tcp/host/ port/dev/udp/host/port(其中 host 为主机名或主机地址,port 为名称指定的服务或整数端口号),重定向会尝试建立到相应套接字的 tcpsctpudp 连接。

禁止在重定向运算符的字符之间使用中间空格。

<word

使用文件 word 作为标准输入(文件描述符 0)。

>word

使用文件 word 作为标准输出(文件描述符 1)。如果文件不存在,则会创建一个文件。如果文件存在,并且启用了 noclobber 选项,则会导致错误。否则会将其截断为零长度。

>|word

> 相同,但它会覆盖 noclobber 选项。

>>word

使用文件 word 作为标准输出。如果文件存在,则会将输出附加到此文件(通过首先查找到文件结尾)。否则会创建文件。

<>word

打开文件 word 以便作为标准输入读取和写入。

<<[-]word

读取在删除任何引用后与 word 相同的行之前或文件结尾之前的 shell 输入。不会对 word 执行参数替换、命令替换、算术替换或文件名生成。生成的名为 here-document 的文档将成为标准输入。如果引用了 word 的任何字符,则不会对文档的字符进行任何解释。否则会执行参数扩展、命令替换和算术替换,忽略 \e换行符,并且必须使用 \e 引用字符 \e$`。如果将 - 附加到 <<,则会从 word 和文档删除所有前导制表符。如果将 # 附加到 <<,则会从文档的第一行中删除前导空格和制表符,并从其余行和 word 中最多删除等效的缩排。制表停止位置应每 8 列出现一次,以便确定缩排。

<<<word

生成 here document 的简捷形式,在此简捷形式中,在执行任何参数扩展、命令替换和算术替换之后,word 将成为 here-document 的内容。

<&digit

从文件描述符 digit 复制标准输入,类似地,对于标准输出,请使用 >&digit。请参见 dup(2)。

<&digit-

digit 指定的文件描述符移至标准输入。类似地,对于标准输出,请使用 >&digit-

<&-

关闭标准输入。类似地,对于标准输出,请使用 >&-

<&p

将协同进程的输入移至标准输入。

>&p

将协同进程的输出移至标准输出。

<#((expr))

计算算术表达式 expr,并将文件描述符 0 放置在离文件开头的字节数为生成的值的相应位置。当计算 expr 时,变量 CUREOF 的计算结果分别为当前偏移和文件结尾偏移。

>#((expr))

<# 相同,但应用于文件描述符 1。

<#pattern

向前查找到包含模式的下一行的开头。

<##pattern

<# 相同,但将跳过的文件部分复制到标准输出。

如果某个重定向运算符前面带有一个数字,并且没有任何中间空格,引用的文件描述符编号即为该数字(而非缺省值 0 或 1)指定的文件描述符编号。 如果除 >&->#<# 格式以外的其他某个重定向运算符前面带有 {varname},且无中间空格,shell 则会选择 > 10 的文件描述符编号,并将其存储在变量 varname 中。如果 >&-、任何 >#<# 格式前面带有 {varname}varname 的值定义要关闭或定位的文件描述符。例如:

... 2>&1

表示打开文件描述符 2 以便作为文件描述符 1 的副本写入,

exec [n]<file

表示打开文件以便读取,并将文件描述符编号存储在变量 n 中。重定向的指定顺序至关重要。shell 根据评估时的(文件描述符文件)关联来评估每个重定向。例如:

... 1>fname 2>&1

首先将文件描述符 1 与文件 fname 关联。然后,它将文件描述符 2 与文件描述符 1 的关联文件(即 fname)相关联。如果颠倒重定向顺序,文件描述符 2 将与终端关联(假定文件描述符 1 已与此终端关联),文件描述符 1 将与文件 fname 关联。如果命令后跟有 &,并且作业控制处于非活动状态,该命令的缺省标准输入则为空文件 /dev/null。否则,命令执行环境包含调用根据输入和输出规范修改的 shell 的文件描述符。

"环境"

环境是按照标准参数列表的相同传递方式传递给执行程序的名称-值对列表。请参见 environ(5)。

这些名称必须是标识符,值必须是字符串。shell 采用多种方式与环境交互。shell 在调用时扫描环境,为找到的每个名称创建一个变量,为变量指定相应值和属性,并将其标记为 export。执行命令继承此环境。如果用户使用 exporttypeset -x 命令修改了这些变量的值或创建了新的变量,这些变量将成为环境的一部分。因此,向任何执行命令显示的环境包括 shell 最初继承的所有名称-值对(当前 shell 可修改这些名称-值对的值)以及必须在 exporttypeset -x 命令中说明的所有添加内容。通过在任何简单命令或函数前面添加一个或多个变量赋值作为前缀,可以扩展这些简单命令或函数的环境。变量赋值参数是标识符=格式的单词。因此:

TERM=450 cmd args

(export TERM; TERM=450; cmd args)

等效(就执行 cmd 而言,内置命令部分中列出的特殊内置命令除外,这些命令的前面带有一个剑形符号)。如果设置了已过时的 -k 选项,所有变量赋值参数都会放置到环境中,即使这些变量赋值参数出现在命令名称之后。

下面的示例首先输出 a=b c,然后输出 c

echo a=b c
set -k
echo a=b c

此功能旨在用于为早期 shell 版本编写的脚本,强烈建议不要将此功能用于新脚本中。

"函数"

出于历史原因,定义函数有两种方法,即 name() 语法和 function name 语法。本手册页的命令部分介绍了这两种方法。

Shell 函数在内部读取和存储。别名在读取函数时解析。函数的执行方式与将参数作为位置参数传递的命令相似。有关详细信息,请参见本手册页的执行部分。

根据 function name 语法定义并按照名称调用的函数与调用者在同一进程中执行,并与调用者共享所有文件和现有工作目录。调用者捕获的陷阱在函数中重置为其缺省操作。函数未捕获或忽略的陷阱条件导致该函数终止,并将此条件传递给调用者。函数完成之后,在 EXIT 时在函数内部设置的陷阱将在调用者的环境中执行。通常在调用程序和函数之间共享变量。但是,在函数中使用的 typeset 特殊内置命令定义其作用域包括当前函数的局部变量。这些局部变量可以在调用之前传递给变量赋值列表中的调用函数,或者作为以名称引用形式传递的参数传递。函数中的错误将控制权返回给调用者。

通过 . 特殊内置命令调用的使用 name() 语法定义的函数以及使用 function name 语法定义的函数在调用者的环境中执行,并且与调用者共享所有变量和陷阱。在执行这些函数的过程中出现的错误导致函数所在的脚本中止。

特殊内置命令 return 用于从函数调用返回。

使用 typeset 特殊内置命令的 -f+f 选项可以列出函数名称。使用 -f 还可以列出函数文本(如果可用)。使用 unset 特殊内置命令的 -f 选项可以取消定义函数。

函数通常在 shell 执行 shell 脚本时取消设置。必须跨不同 shell 调用定义的函数应放置在目录中,并且 FPATH 变量应包含此目录的名称。也可以在 ENV 文件中指定这些函数。

"规程函数"

每个变量都可以关联有零个或多个规程函数。shell 最初了解规程名称 getsetappendunset,但是在大多数系统中,通过 builtin 内置实用程序提供的 C 编程接口扩展可以在运行时添加其他规程名称。如果为变量定义了 get 规程,则会在引用指定变量时调用此规程。如果为规程函数中的变量 .sh.value 分配了一个值,引用的变量的计算结果将为此值。如果为变量定义了 set 规程,则会在为指定变量分配值时调用此规程。如果为变量定义了 append 规程,则会在将值附加到指定变量时调用此规程。在调用规程之前,为变量 .sh.value 指定该变量的值,在规程结束之后,为该变量分配 .sh.value 的值。如果在规程中取消设置 .sh.value,该值将保持不变。如果为变量定义了 unset 规程,则会在取消设置指定变量时调用此规程。除非从此规程函数中显式取消设置变量,否则无法取消设置此变量。

变量 .sh.name 包含调用了规程函数的变量的名称,.sh.subscript 是此变量的下标,.sh.value 包含在 set 规程函数中分配的值。对于 set 规程,更改 .sh.value 会更改分配的值。

"作业"

如果启用 set 命令的 monitor 选项,交互式 shell 会将作业与每个管道相关联。shell 保存当前作业的表,并使用 jobs 命令输出此表,然后为这些作业分配较小的整数。使用 & 异步启动作业时,shell 输出如下行:

[1] 1234

这表示异步启动的作业的作业编号为 1,并且该作业具有一个(顶级)进程,其进程 ID 为 1234

如果您正在运行作业,并且希望停止此作业,按 Ctrl-z 可向当前作业发送一个 STOP 信号。shell 通常会显示一则该作业已停止的消息,并且会显示其他提示。然后,您可以处理此作业的状态,使用 bg 命令将其放置到后台,或者运行某些其他命令,最后使用前台命令 fg 将其放回到前台。Ctrl-z 立即生效,并在键入时放弃暂挂输出和未读输入,因此它与中断相似。

如果在后台运行的作业尝试从终端读取,则会停止该作业。通常允许后台作业生成输出,但是通过指定命令 sttytostop 可以禁用此功能。如果设置了此 tty 选项,后台作业将在尝试生成输出时停止,就像在尝试读取输入时停止一样。

在 shell 中引用作业有多种方法。根据作业的任何进程的进程 ID 或下列各项之一可以引用作业:

%number

带有指定编号的作业。

%string

命令行以字符串开头的所有作业。

%?string

命令行包含字符串的所有作业。

%%

当前作业。

%+

等效于 %%

%-

以前的作业。

当进程更改状态时,shell 可立即获悉。当作业已被阻塞以致无法执行其他进程时,shell 通常会向您发送通知,但仅在输出提示前发送此通知。其目的是为了避免打扰您的工作。set 命令的通知选项导致 shell 在作业发生更改时立即输出这些作业更改消息。

启用 monitor 选项后,完成的每个后台作业都会触发为 CHLD 设置的所有陷阱。

如果您尝试在作业正在运行或已停止时退出 shell,系统会向您发送您已经停止(在运行)作业警告。使用 jobs 命令可以查看这些作业。如果您立即尝试再次退出,shell 不会向您发出第二次警告,而会终止停止的作业。登录 shell 收到 HUP 信号后,它会将 HUP 信号发送到未使用 disown 内置命令否认的每个作业。

"信号"

如果调用的命令后跟有 &,并且 monitor 选项处于非活动状态,则会忽略该命令的 INTQUIT 信号。否则,信号具有 shell 从父级继承的值。请参见 trap 内置命令。

"执行"

每次读取命令时都会执行替换。如果命令名称与本手册页的特殊内置命令部分中的某个命令名称相匹配,则会在当前 shell 进程中执行此命令。接着,系统会检查此命令名称,查看其是否与某个用户定义函数匹配。如果匹配,则会保存位置参数,并将其重置为函数调用的参数。函数同样在当前 shell 进程中执行。函数完成或发出返回命令之后,系统将恢复位置参数列表。对于使用 function name 语法定义的函数,系统将执行在 EXIT 时在函数中设置的所有陷阱。函数的退出值即为执行的最后一个命令的值。如果命令名称不是特殊内置命令或用户定义函数,而是某个内置命令,则会在当前 shell 进程中执行此命令。

shell 变量 PATH 定义此命令所在的目录的搜索路径。备用路径名称使用冒号 (:) 分隔。缺省路径为 /bin:/usr/bin:,并按此顺序指定 /bin/usr/bin 和当前目录。可以使用两个或多个相邻冒号指定当前目录,也可以使用位于路径列表开头或末尾的一个冒号来指定当前目录。如果命令名称包含斜杠 (/),则不会使用搜索路径。否则,将在此路径的每个目录中搜索具有指定名称的可执行文件(不是目录)。如果找到此文件,并且如果 shell 确定存在与指定路径名对应的内置命令版本,则会在当前进程中调用此内置命令。如果找到此文件,并且此目录还包含在 FPATH 变量的值中,则会将此文件装载到当前 shell 环境,就像是 . 命令的参数一样(除非只扩展预设别名),并按照本手册页中的说明执行具有指定名称的函数。如果未找到此文件,但找到文件 .paths,并且此文件包含一个 FPATH=path 格式的行,其中 path 是现有目录,并且此目录包含具有指定名称的文件,那么,则会将此文件装载到当前 shell 环境,就像是 .特殊内置命令的参数一样,并执行具有指定名称的函数。否则,如果找到此文件,则会创建一个进程,并尝试使用 exec(2) 执行命令。

找到可执行文件后,系统将在此可执行文件所在的目录中搜索名为 .paths 的文件。如果找到此文件,并且该文件包含一个 BUILTIN_LIB=value 格式的行,则会搜索根据 value 命名的库,就像是 builtin -f 的选项参数一样,并且如果此文件包含具有指定名称的内置命令,则会执行此内置命令,而不会执行具有此名称的命令。否则,如果找到此文件,并且该文件的第一行或第二行中包含一个 name= value 格式的行,则会通过将 value 指定的目录添加到目录列表开头来修改环境变量 name。如果 value 不是绝对目录,则会指定一个相对于可执行文件所在目录的目录。如果环境变量 name 不存在,则会将其添加到指定命令的环境列表中。

如果此文件具有执行权限,但不是 a.out 文件,则假定此文件是含有 shell 命令的文件。系统会派生一个单独的 shell 来读取此文件。此种情况下,将删除所有非导出的变量。如果 shell 命令文件没有读取权限,并且/或者如果在此文件中设置了 setuidsetgid 位,此 shell 则会执行其作业为设置权限的代理,并执行此 shell,同时将此 shell 命令文件作为打开文件文件向下传递。带有括号的命令在子 shell 中执行,而不会删除非导出的变量。

"命令重新输入"

从终端设备输入的最后一个 HISTSIZE(缺省值为 512)命令的文本保存在历史文件中。如果未设置 HISTFILE 变量或者如果此变量指定的文件无法写入,则会使用 $HOME/.sh_history。shell 可以访问使用同一名称 HISTFILE 的所有交互式 shell 的命令。内置命令 hist 用于列出或编辑此文件的某个部分。要编辑或列出的文件部分可以根据编号进行选择,或者通过指定此命令的第一个字符或前几个字符来进行选择。可以指定一个命令或一系列命令。如果未将编辑器程序指定为 hist 的参数,则会使用变量 HISTEDIT 的值。如果取消设置 HISTEDIT,则使用已过时的变量 FCEDIT。如果未定义 FCEDIT,则使用 /bin/ed。在退出编辑器时,除非您在未写入的情况下退出,否则将重新输出和执行已编辑的命令。-s 选项(以及已过时的版本中的编辑器名称 -)用于跳过编辑短语并重新执行此命令。此种情况下,在执行之前,可使用 old=new 格式的替换参数来修改命令。例如,使用 'hist -s' 的预设别名 r,键入 `r bad=good c' 将重新执行以字母 c 开头的最新命令,并将出现的第一个字符串 bad 替换为字符串 good。

"内嵌编辑选项"

通常,从终端设备输入的每个命令行在键入时仅后跟有一个换行符(回车或换行符)。如果已激活 emacsgmacsvi 选项,用户则可以编辑命令行。要进入这些编辑模式,请设置相应选项。每次向 VISUALEDITOR 变量分配一个以上述选项名称结尾的值时,都会自动选择编辑选项。

编辑功能要求用户终端将回车作为无换行符的回车接受,并且空格必须覆写屏幕上的当前字符。

除非启用 multiline 选项,否则编辑模式会实现在当前行查看整个窗口的内容的概念。窗口宽度为 COLUMNS 的值(如果定义),否则为 80。如果窗口宽度太小以致无法显示提示,并且至少保留了 8 列来输入相关输入,则会从左侧截断提示。如果此行长于窗口宽度减去 2 的值,则会在窗口末端显示一个标记以便通知用户。当光标移动并达到窗口边界时,该窗口会将光标放置在中间位置。如果该行向窗口右侧、左侧或两侧延伸,标记分别为 ><、*

每种编辑模式下的搜索命令都可以提供对历史文件的访问。仅匹配字符串(而非模式),但字符串中的前导 ^ 将匹配范围限制为从行中的第一个字符开始。

每种编辑模式都具有列出与部分输入的单词匹配的文件或命令的操作。如果对行中的第一个单词或者对 ;|&( 后的第一个单词应用此功能,并且此单词不以 ~ 开头或不包含 /,则会显示 PATH 变量定义的可与部分单词匹配的别名、函数和可执行命令的列表。否则显示与指定单词匹配的文件的列表。如果部分输入的单词不包含任何文件扩展字符,则会在生成这些列表之前附加一个 *。显示生成的列表之后,将重新绘制输入行。这些操作分别称为命令行列出和文件名列出操作。此外,还存在一些称为命令名称完成和文件名完成的其他操作,这些操作计算匹配命令或文件的列表,但不会输出此列表,而是用完整匹配项或部分匹配项替换当前单词。对于文件名完成操作,如果匹配项是唯一的,则会附加一个 /(如果该文件为目录)和空格(如果该文件不为目录)。否则会使用所有匹配文件的最长共同前缀替换此单词。对于命令名称完成,仅使用最后一个 / 后面的文件名部分来查找最长的命令前缀。如果只有一个名称与此前缀匹配,则会将此单词替换为此命令名称,并在后面添加一个空格。当对未生成唯一匹配项的完成操作使用制表符时,后续制表符将提供带有编号的匹配备用项的列表。通过输入后跟有制表符的选择编号,可以选择特定项。

"键绑定"

KEYBD 陷阱可用于在键入键时拦截键,并更改 shell 实际看到的字符。当从终端读取时,将在输入每个字符(如果第一个字符为 ESC,则为字符序列)后执行此陷阱。

变量 .sh.edchar 包含生成此陷阱的字符或字符序列。在陷阱操作中更改 .sh.edchar 的值将导致 shell 的行为就像新值(而非原始值)是从键盘输入的一样。变量 .sh.edcol 设置为输入时光标所在的输入列编号。当处于 vi 插入模式时,变量 .sh.edmode 设置为 ESC,在其他情况下则设置为空。在分配给 .sh.edchar 的值前面添加 ${.sh.editmode} 将导致 shell 更改为此控制模式(如果未处于此模式下)。

对于作为编辑指令的参数输入的字符,或者当读取字符搜索的输入时,不会调用此陷阱。

"emacs 编辑模式"

通过启用 emacsgmacs 选项,可以进入此模式。这两种模式之间的唯一区别在于它们对 ^T 的处理方式。要进行编辑,用户应将光标移至需要校正的位置,然后根据需要插入或删除字符或单词。所有编辑命令均为控制字符或转义序列。控制字符的表示法为后跟有字符的插入记号 (^)。

例如,^F 是 Ctrl/F 的表示法。按住 Ctrl(控制)键并按下 f 可以输入 ^F。不按下 Shift 键。(表示法 ^? 表示 Del(删除)键。)

转义序列的表示法为后跟有字符的 M-。例如,通过先后按下 Esc (ASCII 033) 和 f 可以输入 M-f(发音为 Meta f)。M-F 是后跟有 F 的 ESC 的表示法。

所有编辑命令都可从行中的任意位置运行,而不仅限于行开头。除非另行说明,否则不会在编辑命令之后输入回车或换行符键。

^F

将光标向前(向右)移动一个字符。

M-[C

将光标向前(向右)移动一个字符。

M-f

将光标向前移动一个单词。对于 emacs 编辑器而言,单词是仅由字母、数字和下划线组成的字符串。

^B

将光标向后(向左)移动一个字符。

M-[D

将光标向后(向左)移动一个字符。

M-b

将光标向后移动一个单词。

^A

将光标移至行开头。

M-[H

将光标移至行开头。

^M

将光标移至行尾。

M-[Y

将光标移至行尾。

^]char

将光标向前移动到当前行中的字符 char

M-^]char

将光标向后移动到当前行中的字符 char

^X^X

交换光标和标记。

erase

删除上一字符。用户定义的清除字符使用 stty(1) 命令定义,该字符通常为 ^H#

lnext

删除下一字符的编辑功能。用户定义的下一文本字符使用 stty(1) 命令定义,如果未定义此字符,则为 ^V

^D

删除当前字符。

M-d

删除当前单词。

M-^H

元 Back Space 键。删除上一单词。

M-h

删除上一单词。

M-^?

元 Del 键。删除上一单词。如果中断字符为 ^?(缺省为 DEL),则不会运行此命令。

^T

emacs 模式下将当前字符与上一字符换位并向前移动光标。在 gmacs 模式下将前两个字符换位。

^C

大写当前字符。

M-c

大写当前单词。

M-l

将当前单词更改为小写字母。

^K

删除光标至行尾之间的内容。如果此命令前面带有一个其值小于当前光标位置的数字参数,则删除指定位置到光标之间的内容。如果此命令前面带有一个其值大于当前光标位置的数字参数,则删除光标到指定光标位置之间的内容。

^由 W

删除光标到标记之间的内容。

M-p

将光标到标记之间的区域推送到堆栈中。

kill

删除整个当前行。用户定义的删除字符使用 stty(1) 命令定义,该字符通常为 ^G@。如果连续输入了两个删除字符,从此时起输入的所有删除字符都会导致一个换行符。当使用纸张终端时,此功能非常有用。

^Y

恢复从行中删除的上一项。在行中重新输出此项。

^L

换行并输出当前行。

M-^L

清除屏幕。

^@

空字符。设置标记。

M-space

元空格。设置标记。

^J

新行。执行当前行。

^M

返回。执行当前行。

EOF

仅当当前行为空时,文件结尾字符(通常为 ^D)才会作为文件结尾处理。

^P

获取上一命令。每次输入 ^P 时,都会访问前面的上一命令。如果该命令不在多行命令的第一行中,则往回移动一行。

M-[A

等效于 ^P

M-<

获取最早(最旧)的历史行。

M->

获取最近(最新)的历史行。

^N

获取下一命令行。每次输入 ^N 时,都会访问后面的下一命令。

M-[B

等效于 ^N

^Rstring

颠倒含有 string 的上一命令行的搜索历史。如果指定参数 0,搜索则为正向搜索。string 以回车或换行符结束。如果 string 前面带有 ^,匹配行必须以 string 开头。如果省略了 string,则会访问包含最新的 string 的下一命令行。此种情况下,参数 0 将颠倒搜索方向。

^O

运行。执行当前行,获取历史文件中相对于当前行的下一行。

M-digits

转义。定义数字参数。这些数字作为下一命令的参数。接受参数的命令包括:^F^BERASE^C^D^K^R^P^N^]M-.M-M-^]M-_M-=M-bM-cM-dM-fM-hM-lM-^H

M-letter

软键。根据名称 letter 在别名列表中搜索别名。如果定义了 letter 的名称,则在输入队列中插入其值。letter 不能是此部分中的元函数之一。

M-[letter

软键。根据名称 letter 在别名列表中搜索别名。如果定义了此名称的别名,则在输入队列中插入其值。此命令可用于在许多终端上对功能键进行编程。

M-.

在行中插入上一命令的最后一个单词。如果此命令前面带有一个数字参数,此参数的值确定要插入的单词,而不是最后一个单词。

M-_

M-. 相同。

M-*

尝试根据当前单词生成文件名。如果单词不与任何文件匹配或不包含任何特殊模式字符,则会附加一个星号。

M-ESC

按照本手册页中的说明执行命令或文件名完成操作。

^ITAB

尝试按照本手册页中的说明执行命令或文件名完成操作。如果发生部分完成,重复此操作的行为就像输入了 M-= 一样。如果未找到匹配项或者在空格后输入,则会插入一个制表符。

M-=

如果此命令前面没有数字参数,则会按照本手册页中的说明生成匹配的命令或文件名的列表。否则,光标下的单词将替换为与最近生成的命令或文件列表中的数字参数的值相对应的项。如果光标不在单词上方,则会插入此单词。

^U

将下一命令的参数乘以 4

\e

对下一字符进行转义。如果前面带有 \e,则可以在命令行或搜索字符串中输入编辑字符、用户的清除、删除和中断(通常为 ^?)字符。\e 删除下一字符的编辑功能(如果有)。

M-^V

显示 shell 版本。

M-#

如果行不以 # 开头,则会在此行开头以及每个换行符后面插入一个 #,并输入此行。这会导致在历史文件中插入注释。如果行以 # 开头,则会删除 #,并删除每个换行符后面的一个 #

"vi 编辑模式"

有两种键入模式。最初,当您输入命令时,您处于输入模式下。要进行编辑,用户应通过键入 ESC (033) 进入控制模式,将光标移至需要校正的位置,然后根据需要插入或删除字符或单词。大多数控制命令都接受命令前面的可选重复 count

当在大多数系统上处于 vi 模式时,如果速度为 1200 波特或更大值,并且命令包含任何控制字符,或者自输出提示以来所经过的时间不到 1 秒,则会在一开始时启用标准化处理,并重新回显命令。ESC 字符终止命令提示的标准化处理,然后用户可以修改命令行。此方案具有标准化处理以及对原始模式进行输入提示回显的优势。

如果还设置了选项 viraw,终端始终会禁用标准化处理。对于不支持两种备用的行尾分隔符的系统,此模式是固有的,并且对某些终端可能会很有用。

"输入编辑命令"

缺省情况下,编辑器处于输入模式。

支持下列输入编辑命令:

ERASE

使用 stty 命令定义的用户定义清除字符,通常为 ^H#。删除上一字符。

^由 W

删除由空格分隔的上一单词。在某些系统上,可能需要使用 viraw 选项,此命令才能正常运行。

EOF

除非设置了 ignoreeof 选项,否则行的第一个字符将导致 shell 终止。否则,将忽略此字符。

lnext

使用 stty(1) 定义的下一用户定义文本字符,如果未定义此字符,则为 ^V。删除下一字符的编辑功能(如果有)。在某些系统上,可能需要使用 viraw 选项,此命令才能正常运行。

\e

将下一 ERASE 或 KILL 字符转义。

^I TAB

尝试按照本手册页中的说明执行命令或文件名完成操作,并返回到输入模式。如果发生部分完成,重复此操作的行为就像从控制模式输入了 = 一样。如果未找到匹配项或者在空格后输入,则会插入一个制表符。

"运动编辑命令"

运动编辑命令可移动光标。

支持下列运动编辑命令:

[count]l

将光标向前(向右)移动一个字符。

[count][C

将光标向前(向右)移动一个字符。

[count]w

将光标向前移动一个字母数字单词。

[count]W

将光标移至空格后的下一个单词的开头。

[count]e

将光标移至单词末尾。

[count]E

将光标移至以当前空格分隔的单词的末尾。

[count]h

将光标向后(向左)移动一个字符。

[count][D

将光标向后(向左)移动一个字符。

[count]b

将光标向后移动一个单词。

[count]B

将光标移至以空格分隔的上一单词。

[count]|

将光标移至列 count

[count]fc

在当前行中查找下一字符 c

[count]Fc

在当前行中查找上一个字符 c

[count]tC

等效于 f 后跟 h

[count]Tc

等效于 F 后跟 l

[count];

重复最后一个单字符查找命令 count 次:fF, t、T

[count],

反向最后一个单字符查找命令 count 次。

0

将光标移到行首。

^

将光标移到行首。

[H

将光标移到行中的第一个非空白字符。

$

将光标移至行尾。

[Y

将光标移至行尾。

%

移动到对称的 (){}[]。如果光标不在本部分所述的任何一个字符上,将先在该行的剩余部分中搜索第一次出现的这些字符之一。

"搜索编辑命令"

搜索编辑命令可以访问您的命令历史记录。

支持下列搜索编辑命令:

[count]k

获取上一命令。每次输入 k 时,都会访问之前的上一条命令。

[count]-

获取上一命令。每次输入 k 时,都会访问之前的上一条命令。 等效于 k

[count][A

获取上一命令。每次输入 k 时,都会访问之前的上一条命令。 等效于 k

[count]j

获取下一条命令。每次输入 j 时,都会访问以后的下一条命令。

[count]+

获取下一条命令。每次输入 j 时,都会访问以后的下一条命令。 等效于 j

[count][B

获取下一条命令。每次输入 j 时,都会访问以后的下一条命令。 等效于 j

[count]G

获取命令编号 count。缺省命令为最早的历史命令。

/字符串

在历史记录中向后搜索包含 string 的上一条命令。string 以回车或换行符结束。如果 string 前面带有 ^,匹配行必须以 string 开头。如果 string 为空,则使用上一个字符串。

?字符串

在历史记录中向前搜索包含 string 的上一条命令。string 以回车或换行符结束。如果 string 前面带有 ^,匹配行必须以 string 开头。如果 string 为空,则使用上一个字符串。 除了搜索方向是向前外,其余均与 / 相同。

n

向后搜索 /? 命令的最后一个模式的下一个匹配项。

N

向前搜索 /? 的最后一个模式的下一个匹配项。

"文本修改编辑命令"

以下命令可修改行:

a

进入输入模式并在当前字符后输入文本。

A

将文本附加到行尾。等效于 $a

[count]cmotion

c[count]motion

从当前字符删除到 motion 将光标移动到的字符,并进入输入模式。如果 motionc,将删除整行并进入输入模式。

C

从当前字符删除到行尾并进入输入模式。等效于 c$

S

等效于 cc

[count]s

在输入模式中替换光标下方的字符。

D[count]dmotion

从当前字符删除到行尾。等效于 d$。

d[count]motion

从当前字符删除到 motion 将移动到的字符。如果 motion 为 d,将删除整行。

i

进入输入模式并在当前字符前插入文本。

I

在行首之前插入文本。等效于 0i

[count]P

在光标之前放置以前修改的文本。

[count]p

在光标之后放置以前修改的文本。

R

进入输入模式并将屏幕上的字符替换为您以覆盖方式键入的字符。

[count]rc

将从当前光标位置开始的 count 个字符替换为 c,并向前移动光标。

[count]x

删除当前字符。

[count]X

删除前面的字符。

[count].

重复上一条文本修改命令。

[count]~

转换从当前光标位置开始的 count 个字符的大小写,并向前移动光标。

[count]_

促使附加上一条命令中的 count 单词并进入输入模式。如果省略 count,则使用最后一个单词。

*

促使 * 附加到当前的单词并尝试生成文件名。如果未找到匹配项,则会发出铃声。否则,将该单词替换为匹配模式并进入输入模式。

\e

按照本手册页中的说明执行命令或文件名完成操作。

"其他编辑命令"

支持下列其他编辑命令:

[count]ymotion

y[count]motion

将当前字符到 motion 将光标移动到的字符全部移出。将移出的字符放在删除缓冲区中。文本和光标位置保持不变。

yy

移出当前行。

Y

移出从当前的光标位置直到行尾的当前行。等效于 y$

u

撤消最后一个文本修改命令。

U

撤消对当前行执行的所有文本修改命令。

[count]V

返回以下命令:

hist -e ${VISUAL:-${EDITOR:-vi}} count
该命令位于输入缓冲区中。如果省略 count,则使用当前行。

^L

换行并输出当前行。该命令仅在控制模式下使用。

^J

新行。无论处于什么模式下,都执行当前行。

^M

返回。无论处于什么模式下,都执行当前行。

#

如果该命令的第一个字符是 #,则删除该 # 及换行符之后的每个 #。 否则,在该命令的每行前面插入 # 之后发送该行。 该命令非常有用,可以将当前行作为注释插入历史记录中,以及取消注释历史文件中以前带有注释的命令。

[count]=

如果未指定 count,则生成本手册页中所述的匹配命令或文件名的列表。 否则,将当前光标位置的单词替换为最近生成的命令或文件列表中的 count 项。如果光标未停留在单词上,则会在当前光标位置之后插入该项。

@letter

在别名列表中按名称 letter 搜索别名。如果该名称的别名已经定义,则在输入队列中插入其值以进行处理。

^A

显示 shell 的版本。

"内置命令"

以下的简单命令将在 shell 进程中执行。允许输入和输出重定向。除非另有说明,否则输出将写入在文件描述符 1 中,并且退出状态(如果没有语法错误)为 0。除了 :truefalseechonewgrplogin 外,其他所有的内置命令都接受 -- 以指示选项结束。它们还可以将选项 --man 解释为在标准错误中显示手册页的请求,以及将 -? 解释为在标准错误中输出用法消息的帮助请求。

前面添加了一个或两个 ++ 符号的命令是特殊的内置命令,将通过以下方式进行特殊处理:

1. 命令完成时,该命令前面的变量赋值列表仍然有效。

2. 在变量赋值之后处理 I/O 重定向。

3. 脚本中包含的错误会导致其中止。

4. 它们不是有效的函数名称。

5. 对于跟在前面添加了 ++ 的命令之后且格式为变量赋值格式的单词,将通过与变量赋值相同的规则进行扩展。这意味着将在 = 符号之后执行波浪号替换,并且不执行字段分割和文件名生成。

+ : [arg ...]

该命令仅扩展参数。

+ . name [arg ...]

如果 name 是一个通过 function name 保留字语法定义的函数,则会在当前环境中执行该函数(就好像它是通过 name() 语法定义的一样)。否则,如果 name 表示一个文件,则会读取整个文件并在当前的 shell 环境中执行命令。通过 PATH 指定的搜索路径用于查找包含该文件的目录。如果指定了任何参数 arg,则在处理 . 命令时这些参数将变为位置参数,并在完成时恢复原始的位置参数。否则,位置参数保持不变。退出状态是最后执行的命令的退出状态。

++ alias [-ptx] [name[ =value]] ...

不包含参数的 alias 可在标准输出中以 name=value 的格式输出别名列表。可通过 -p 选项在每个名称之前插入单词 alias。如果指定一个或多个参数,将为已指定其 value 的每个 name 定义 alias。可通过 value 中的结尾空格选中下一个单词进行别名替换。过时的 -t 选项用于设置和列出被跟踪的别名。被跟踪别名的值是与指定的 name 对应的完整路径名。如果 PATH 的值重置但别名仍被跟踪,被跟踪别名的值将变成未定义的值。如果没有 -t 选项,则对于参数列表中没有为其指定 value 的每个 name,都将输出别名的名称和值。过时的 -x 选项没有作用。如果指定了 name,但没有提供值,也没有为 name 定义别名,则退出状态为非零

bg [ job...]

该命令仅适用于支持作业控制的系统。将指定的每个 job 放入后台。如果未指定 job,则将当前作业放入后台。请参见本手册页的 Jobs 部分了解 job 格式的说明。

+ break [n]

从封闭的 forwhileuntilselect 循环(如果有)中退出。如果指定了 n,则分成 n 个级别。

builtin [-ds ] [-f file] [name ...]

如果未指定 name-f 选项,将在标准输出中输出内置名称。-s 选项仅输出特殊的内置名称。否则,每个 name 都代表其基名为内置名称的路径名。入口点函数名称通过在内置名称前面加上 b 确定。内置命令 mycommand 的 ISO C/C++ 样例为 bmycommand(int argc, char *argv[], void *context),其中 argvargc 元素的数组,context 是指向如 <ast/shell.h> 中所述的 Shell_t 结构的可选指针。不能将特殊内置名称绑定到路径名或删除。-d 选项可删除所指定的每个内置名称。在支持动态装载的系统上,-f 选项可命名包含内置名称代码的共享库。可以省略共享库的前缀和/或后缀,具体取决于系统。装载某个库之后,其符号将可用于 builtin 的后续调用。可通过单独调用 builtin 命令指定多个库。按指定库时的反向顺序搜索库。装载某个库之后,该库将在名称为 lib_init() 的库中查找函数,并将此函数与参数 0 一起调用。

cd [-LP] [arg]

cd [-LP] old new

该命令具有两种形式。 在第一种形式中,它将当前目录更改为 arg。如果 arg-,目录将被更改为以前的目录。shell 变量 HOME 是缺省的 arg。变量 PWD 被设置为当前目录。shell 变量 CDPATH 定义包含 arg 的目录的搜索路径。备用路径名称使用冒号 (:) 分隔。缺省路径是 NULL(指定当前目录)。当前目录是通过空路径名指定的,可以直接显示在等号之后或显示在路径列表中任何其他位置的冒号分界符之间。如果 arg/ 开头,则不使用搜索路径。否则,将搜索路径中每个目录的 argcd 的第二种形式在当前目录名称 PWD 中用字符串 new 替换字符串 old,并尝试更改为此新目录。缺省情况下,在查找目录名称时会按字面意思处理符号链接名称。这等效于 -L 选项。可通过 -P 选项在确定目录时解析符号链接。命令行中的 -L-P 的最后一个实例可确定使用的方法。不能通过 rksh 执行 cd 命令。

command [-pvVx] name [arg ...]

如果没有 -v-V 选项,则通过由 arg 指定的参数执行 name。 可通过 -p 选项搜索缺省路径,而不是 PATH 的值指定的路径。查找 name 时不会搜索函数。此外,如果 name 表示特殊内置名称,将忽略与前导剑形符号关联的任何特殊属性。例如,预定义别名 redirect='command exec' 可在指定的重定向无效时阻止脚本终止。 在带有 -x 选项的情况下,如果由于参数过多会导致命令执行失败(errno E2BIG),shell 将多次调用命令 name,且每次调用时包含部分参数。每次调用时,将会传递在扩展到多个参数的第一个单词之前以及在扩展到多个参数的最后一个单词之后出现的参数。退出状态为最大调用退出状态。 在带有 -v 选项的情况下,command 等效于本部分中所述的内置 whence 命令。-V 选项使 command 的作用相当于 whence -v

+continue [n]

继续执行封闭的 forwhileuntilselect 循环的下一次重复。如果指定了 n,则从第 n 次封闭循环继续执行。

disown [job...]

促使该 shell 在登录 shell 终止时不将 HUP 信号发送至指定的每个 job,或不发送至所有活动作业(如果省略 job)。

echo [arg ...]

如果第一个 arg 不以 - 开头,并且所有的参数均不包含反斜杠 (\e),则会输出其所有参数,并用空格隔开以及换行符终止。否则,echo 的行为与系统相关,并且应使用本部分中所述的 printprintf。请参见 echo(1) 了解用法和说明。

+eval [arg ...]

将这些参数作为输入读取到 shell 并执行生成的命令。

+exec [-c] [-a name ...] [arg ...]

如果指定了 arg,将执行这些参数指定的命令而不是此 shell,同时不创建新进程。可通过 -c 选项在应用与 exec 调用关联的变量赋值之前清除环境。可通过 -a 选项将 name(而不是第一个 arg)变成新进程的 argv[0]。输入参数与输出参数可以显示并影响当前进程。如果未指定 arg,则该命令的作用是修改输入/输出重定向列表所指定的文件描述符。在这种情况下,任何通过该机制打开的 2 以上的文件描述符编号将在调用其他程序时关闭。

+exit [n]

促使 shell 退出,退出状态由 n 指定。该值是指定状态的最低有效 8 位。如果省略 n,则退出状态为最后执行的命令的退出状态。此外,也可通过文件结尾使 shell 退出,但启用了 ignoreeof 选项的 shell 除外。请参见 set

++export [-p] [name[=value]] ...

如果未指定 name,将输出具有导出属性的每个变量的名称和值,并且以能够重新输入的方式将值括起来。可通过 -p 选项在每个名称之前插入单词 export。否则,将对指定的 name 添加标记以自动导出到后续执行的命令的环境中。

false

不执行任何操作,退出 1。与 until 结合使用以实现死循环。

fg [job ...]

该命令仅适用于支持作业控制的系统。将指定的每个 job 放入前台并按指定顺序等待。否则,将当前作业放入前台。请参见 Jobs 了解 job 格式的说明。

getconf [name [pathname]]

输出 name 指定的配置参数的当前值。配置参数是通过 IEEE POSIX 1003.1 和 IEEE POSIX 1003.2 标准定义的。请参见 pathconf(2) 和 sysconf(3C)。 其值取决于文件系统中的位置的参数需要 pathname 参数。如果未指定参数,getconf 将输出当前配置参数的名称和值。对需要 pathname 的每个参数使用路径名 /

getopts [ -a name] optstring vname [arg ...]

检查 arg 是否具有合法选项。如果省略了 arg,则会使用位置参数。选项参数以 +- 开始。不是以 + - 开始的选项或者参数 -- 会终止选项。当 optstring+ 开始时,仅识别以 + 开始的选项。optstring 包含 getopts 可识别的字母。如果字母后面跟有一个 :,则该选项需要有一个参数。选项与参数之间可以用空格隔开。选项 -? 促使 getopts 在标准错误输出中生成用法消息。-a 选项可用于指定用法消息使用的名称,缺省情况下为 $0。每次调用时,getopts 都将它找到的下一个选项字母放在变量 vname 内。如果 arg+ 开始,会在选项字母前面加上 +。下一个 arg 的索引存储在 OPTIND 中。选项参数(如果有)存储在 OPTARG 中。optstring 中的前导 : 促使 getopts 将无效选项的字母存储在 OPTARG 中,并在缺少所需的选项参数时针对未知选项和 to: 将 vname 设置为 ?。其他情况下,getopts 将显示一条错误消息。如果没有更多选项,则退出状态是非零的。无法指定以下任何选项::+-?[]。只能将 # 选项指定为第一个选项。

hist [ -e ename][-nlr] [ first[last ] ]

hist -s [ old=new ] [ command]

在第一种形式中,从 firstlast 的命令范围是从在终端键入的最后的 HISTSIZE 命令中选择的。参数 firstlast 可以指定为数字或字符串。字符串用于从指定字符串开始查找最近的命令。负数用作到当前命令数的偏移。如果选择 -l 选项,命令将列在标准输出中。否则,在包含这些键盘命令的文件中调用编辑器程序 ename。如果未提供 ename,将使用变量 HISTEDIT 的值。如果未设置 HISTEDIT,将 FCEDIT(缺省为 /bin/ed)用作编辑器。编辑完成后,如果更改已经保存,将执行编辑后的命令。如果未指定 last,将它设置为 first。如果未指定 first,针对编辑和列举的缺省值分别为上一条命令和 -16。选项 -r 颠倒命令顺序,选项 -n 在列举时隐藏命令数。在第二种形式中,将 command 解释为本部分中所述的 first,缺省为最后执行的命令。在执行可选替代 old=new 之后执行生成的命令。

jobs -lnp [job ...]

列出有关每个指定作业或(如果省略 job)所有活动作业的信息。除普通信息外,-l 还列出进程 ID。-n 选项仅显示自上次通知起已停止或退出的作业。可通过 -p 选项只列出进程组。请参见 Jobs 了解 job 格式的说明。

kill [-s signame] job ...

kill [-n signum] job ...

kill -l [sig ...]

向指定作业或进程发送 TERM(终端)信号或指定信号。通过具有 -n 选项的数字或具有 -s 选项的名称指定信号(如 <signal.h> 中指定,除去前缀 `SIG,除非将 SIGCLD 命名为 CHLD)。为实现向后兼容,可以省略 ns,将数字或名称紧跟 - 之后。如果已发送的信号是 TERM(终端)或 HUP(挂断),在作业或进程停止时将其作为 CONT(继续)信号发送。参数 job 可以是不属于某个活动作业的进程的进程 ID。请参见 Jobs 了解 job 格式的说明。在第三种形式 kill -l 中,如果未指定 sig,将列出信号名称。否则,对于作为名称的每个 sig,将列出相应的信号编号。对于作为编号的每个 sig,将列出与 sig 的最低有效 8 位对应的信号名称。

let [arg ...]

每个 arg 都是一个可求值的独立算术表达式。请参见本手册页的 Arithmetic Evaluation 部分,了解算术表达式求值的说明。如果最后一个表达式的值是非零,则退出状态为 0,否则为 1

+newgrp [arg ...]

等效于 exec /bin/newgrp arg ...

print [-Renprs] [ -u unit] [ -f format ] [ arg ...]

如果没有选项或者具有选项 ---,将在标准输出中输出每个 arg。可通过 -f 选项按 printf 所述输出参数。在这种情况下,忽略任何 enrR 选项。除非指定 -R-r,,否则应用以下转义约定:

\ea

警报字符 (ASCII 07)

\eb

退格字符 (ASCII 010)

\ec

使输出终止,而不处理更多参数,且不添加换行符

\ef

换页字符 (ASCII 014)

\en

换行符 (ASCII 012)

\er

RETURN 字符 (ASCII 015)

\et

TAB 字符 (ASCII 011)

\ev

垂直 TAB 字符 (ASCII 013)

\eE

转义符 (ASCII 033)

\e\e

反斜杠字符 \e

\e0x

通过 x 指定的 1、2 或 3 位八进制字符串定义的字符

-R 选项输出除 -n 之外的所有后续参数和选项。可通过 -e 应用转义约定,这是缺省行为。它颠倒早先 -r 的效果。可通过 -p 选项将参数写入到通过 |& 产生的进程管道中,而不是标准输出中。可通过 -s 选项将参数写入到历史文件中而不是标准输出中。-u 选项可用于指定输出所在的一位文件描述符单元编号 unit。缺省值为 1。如果使用 -n 选项,则不会将换行符添加到输出中。

printf format[arg ...]

根据与格式字符串 format 关联的 ANSI-C 格式化规则,在标准输出中输出参数 arg。如果参数的数目超过格式指定的数目,将重用该格式字符串格式化剩余的参数。还可以使用以下表达式:可以用 %b 格式代替 %s 以按照 print 中的说明扩展对应 arg 中的转义序列。可通过 %B 选项将每个参数作为变量名称处理并输出变量的二进制值。这对于具有属性 b 的变量非常有用。可以用 %H 格式代替 %s,以便将 arg 中对 HTMLXML 特殊的字符作为它们的实体名称输出。可以用 %P 格式代替 %s,以便将 arg 解释为扩展的正则表达式并作为 shell 模式输出。可以用 %R 格式代替 %s,以便将 arg 解释为 shell 模式并作为扩展的正则表达式输出。可以用 %q 格式代替 %,以便通过可重新输入到 shell 的方式引用生成的字符串。%(date-format)T 格式可用于将参数作为日期/时间字符串来处理并根据为 date(1) 命令定义的 date-format 格式化日期/时间。%Z 格式可输出其值为 0 的字节。%d 格式的精度字段可以后跟 a . 和输出基数。在这种情况下,可通过 # 标志字符使 base# 前置。# 标志与 d 说明符一起使用但没有输出基数时,使输出以千分位显示,后缀 k M G T P E 中的其中一个表示单位。# 标志与 i 说明符一起使用时,使输出以 1024 显示,后缀 Ki Mi Gi Ti Pi Ei 中的其中一个表示单位。已添加 = 标志以使输出在指定的字段宽度内居中。

pwd [-LP]

输出当前工作目录的值。-L 选项为缺省选项,用于输出当前目录的逻辑名称。如果指定了 -P 选项,将基于该名称解析所有的符号链接。命令行中的 -L-P 的最后一个实例可确定使用的方法。

read [-Aprs] [-d delim] [ -n n] [[ -N n ] [[-t timeout] [-u unit] [vname?prompt] [ vname ... ]

shell 输入机制。读取一行并使用 IFS 中的字符作为分隔符将该行分为多个字段。转义符 \e 用于去除下一个字符和续行符的任何特殊含义。可通过 -d 选项将读取延续到 delim(而不是换行符)的第一个字符。可通过 -n 选项最多只读取 n 字节而不是整行,但在从速度较慢的设备中读取时,只要已读取任何字符即将其返回。可通过 -N 选项恰好读取 n 字节,除非到达文件结尾或因设置了 -t 选项而导致读取超时。在原始模式下 (-r),不特殊处理 \e 字符。第一个字段分配给第一个 vname,第二个字段分配给第二个 vname,以此类推,剩余的字段分配给最后一个 vname。如果 vname 具有二进制属性并且已指定 -n-N,读取的字节将直接存储在变量中。如果已指定 -v,将第一个 vname 的值用作从终端设备读取时的缺省值。可通过 -A 选项取消设置变量 vname,并使读取的每个字段存储在索引数组 vname 的连续元素中。通过 -p 选项,使用 |& 从 shell 产生的进程输入管道中获取输入行。如果存在 -s 选项,将输入另存为历史文件中的命令。选项 -u 可用于指定从中读取的一位文件描述符单元 unit。可以通过特殊的内置命令 exec 打开文件描述符。单元 n 的缺省值是 0。选项 -t 用于指定从终端或管道读取时以秒为单位的超时。如果省略 vname,则 REPLY 将用作缺省的 vname。具有 -p 选项的文件结尾可清除该进程,这样可以生成其他进程。如果第一个参数包含 ?,则当 shell 为交互式 shell 时,该单词的剩余部分将用作标准错误输出中的提示。除非到达文件结尾或读取超时,否则退出状态为 0

++readonly [-p] [ vname[=value]] ...

如果未指定 vname,将输出具有只读属性的每个变量的名称和值,并且以能够重新输入的方式将值括起来。通过 -p 选项将单词 readonly 插入在每个变量之前。否则,将对指定的 vname 标记 readonly,且不能通过后续赋值更改这些名称。

+return [n]

使 shell 函数或脚本返回到具有 n 指定的退出状态的调用脚本。该值是指定状态的最低有效 8 位。如果省略 n,则返回状态为最后执行的命令的返回状态。如果调用的返回不在函数或脚本中,则与退出的行为相同。

+set [ \(+-BCGabefhkmnoprstuvx] [\(+-o [ option ] ] ... [ \(+-A vname] [arg...]

set 命令支持以下选项:

-a

自动导出已定义的所有后续变量。

-A

数组赋值。取消设置变量 vname,并按顺序从 arg 列表中赋值。如果使用 +A,则首先不取消设置变量 vname

-b

一旦后台作业更改状态,即输出作业完成消息,而不是等待下一提示。

-B

启用大括号模式字段生成。这是缺省行为。

-C

阻止重定向 (>) 截断现有文件。通过 O_EXCL 模式打开已创建的文件。要求 >| 在启用时截断文件。

-e

如果命令具有非零退出状态,则执行 ERR 捕获(如果已设置)并退出。该模式在读取配置文件时被禁用。

-f

禁用文件名生成。

-G

在用于文件名生成时,使模式 ** 本身与文件及零个或多个目录和子目录匹配。如果后跟 /,则仅匹配目录和子目录。

-h

每个命令在第一次遇到时将成为被跟踪别名。

-k

已过时。将所有的变量赋值参数放在命令的环境中,而不仅仅是命令名称前面的参数。

-m

后台作业在单独的进程组中运行,并在完成时输出一行。在完成消息中报告后台作业的退出状态。在具有作业控制的系统上,为交互式 shell 自动启用该选项。

-n

读取命令并检查其中是否存在语法错误,但不执行这些命令。 对于交互式 shell,忽略此命令。

-o

如果未提供选项名称,则会将选项及其当前设置的列表写入到标准输出。当与 + 一起调用此命令时,这些选项将以可重新输入到 shell 的格式写入,以便恢复相应设置。重复此选项可以启用或禁用多个选项。 下列参数可以是下列选项名称之一:

allexport

-a 相同。

bgnice

以较低的优先级运行所有后台作业。这是缺省模式。

braceexpand

-B 相同。

emacs

使您进入 emacs 样式的内嵌编辑器以便输入命令。

errexit

-e 相同。

globstar

-G 相同。

gmacs

使您进入 gmacs 样式的内嵌编辑器以便输入命令。

ignoreeof

此 shell 不会在文件结尾退出。必须使用 exit 命令。

keyword

-k 相同。

markdirs

文件名生成操作生成的所有目录名称都附加有尾随 /。

monitor

-m 相同。

multiline

对于长于屏幕宽度的行,内置编辑器在屏幕上使用多个行。这可能不适用于所有终端。

noclobber

-C 相同。

noexec

-n 相同。

noglob

-f 相同。

nolog

不会在历史文件中保存函数定义。

notify

-b 相同。

nounset

-u 相同。

pipefail

管道将在所有管道组件完成后完成,并且返回值为失败的最后一个非零命令的值,如果没有任何命令失败,则为零。

privileged

-p 相同。

showme

启用此命令后,将显示前面带有分号 (;) 的简单命令或管道,就像启用了 xtrace 选项但未执行此选项一样。否则,将忽略前导 ;

trackall

-h 相同。

verbose

-v 相同。

vi

使您进入 vi 样式的内嵌编辑器的插入模式,直到您键入转义符 033 为止。这会使您进入控制模式。回车可发送此行。

viraw

各个字符在 vi 模式下键入时处理。

xtrace

-x 相同。 如果未提供选项名称,则输出当前选项设置。

-p

禁用对$HOME/.profile 文件的处理,并使用文件 /etc/suid_profile(而非 ENV 文件)。当有效 uid (gid) 不等于实际 uid (gid) 时,将启用此模式。禁用此模式会导致将有效 uidgid 设置为实际 uidgid

-r

启用受限 shell。此选项一旦设置便不能取消设置。

-s

按字典顺序对位置参数进行排序。

-t

已过时。读取和执行一个命令后退出。

-u

替换时将 unset 参数视为错误。

-v

在读取 shell 输入行时输出这些行。

-x

在执行命令及其参数时输出这些命令及其参数。

--

不更改任何选项。在将 $1 设置为以 - 开头的值时,此命令非常有用。如果此选项后没有任何参数,则取消设置位置参数。

作为一项已过时的功能,如果第一个 arg 为 -,则会禁用 -x-v 选项,并将下一个 arg 视为第一个参数。使用 +(而非 -)将导致禁用这些选项。此外,还可以在调用 shell 时使用这些选项。当前选项集可在 $- 中找到。除非指定了 -A,否则其余参数均为位置参数,并按照 $1 $2 ... 的顺序进行分配。如果未指定参数,则在标准输出中输出所有变量的名称和值。

+shift [n]

$n+1 ... 中的位置参数重命名为 $1 ...,缺省的 n1。参数 n 可以为任何算术表达式,此算术表达式的计算结果为小于或等于 $# 的非负数字。

+trap -p [action] [sig] ...

-p 选项导致输出与参数指定的每个陷阱相关联的陷阱操作,并进行相应引用。否则,当 shell 接收信号 sig 时,则会处理 action,就像它是 eval 的参数一样。可以以编号或信号名称的形式指定每个 sig。陷阱命令按照信号编号的顺序执行。尝试对输入到当前 shell 时忽略的信号设置陷阱将不起作用。如果省略了 action,并且第一个 sig 为编号,或者如果 action-,则会将每个 sig 的陷阱重置为其原始值。如果 action 为空字符串,shell 及其调用的命令将忽略此信号。如果 sigERR,当命令的退出状态为非零时,将执行 action。如果 sigDEBUG,则会在每个命令之前执行 action。当运行 action 时,变量 .sh.command 包含当前命令行的内容。如果 sig0EXIT,并且在使用 function name 语法定义的函数主体内执行陷阱语句,则会在此函数完成后执行命令 action。对于在任何函数外部设置的陷阱,如果 sig0EXIT,则会在退出时从 shell 执行命令 action。如果 sigKEYBD,则会在 emacsgmacsvi 模式下读取键时执行 action。不带参数的 trap 命令输出与各信号编号关联的命令的列表。

true

不执行任何操作,退出 0。与 while 一起用于无限循环。

++typeset [\(+-AHflabnprtux ] [ \(+-EFLRZi[n] ] [ vname[=value ] ]

设置 shell 变量和函数的属性及值。当在使用 function name 语法定义的函数内部调用时,将创建一个新的 vname 变量实例,并在此函数完成时恢复变量的值和类型。 使用 +(而非 -)将导致禁用这些选项。如果未指定 vname 参数,则输出变量的 vname(以及可选 value)的列表。使用 +(而非 -)可防止输出值。-p 选项导致在每个名称(而非选项名称)之前输出后跟有选项字母的 typeset。如果指定了除 -p 以外的任何选项,则仅输出具有所有指定选项的变量。否则输出具有属性的所有变量的 vnameattributes。 可以指定下列属性列表:

-a

vname 声明为索引数组。这是可选属性(除非用于复合变量赋值)。

-A

vname 声明为关联数组。下标是字符串,而不是算术表达式。

-b

此变量可保存任意字节数目的数据。数据可以是文本或二进制数据。此变量的值通过数据的 base64 编码表示。如果还指定了 -Z,缓冲区中的数据大小(以字节为单位)则由与 -Z 关联的大小确定。如果分配的 base64 字符串导致生成更多数据,则会截断此数据。否则,则会使用值为零的字节填充此数据。printf 格式 %B 可用于输出此缓冲区中的实际数据,而非数据的 base64 编码。

-E

vname 声明为双精度浮点数。如果 n非零,则定义扩展 vname 时使用的有效数字的数目。否则使用 10 个有效数字。

-f

这些名称引用函数名称,而非变量名称。不会进行赋值,其他有效选项仅包括 -t-u-x-t 选项对此函数启用执行跟踪。-u 选项导致将此函数标记为未定义。搜索 FPATH 变量,以便在引用函数时查找函数定义。如果指定了除 -f 以外的选项,则会在标准输出中显示函数定义。如果指定了 +f,则会显示一个行,此行包含后跟有一条 shell 注释的函数名称,此注释包含行号以及定义此函数所在的文件的路径名(如果有)。 -i 属性无法与 -f 一起指定。

-F

vname 声明为双精度浮点数。如果 n非零,则定义扩展 vname 时使用的小数点后面的小数位数。否则使用小数点后面的 10 个小数位数。

-H

此选项提供非 UNIX 计算机上的 UNIX 到主机名文件的映射。

-i

将要在内部表示的 vname 声明为整数。当指定为整数时,赋值右侧将作为算术表达式计算。如果 n非零,则会定义输出算术基数,否则输出基数为 10。 -i 属性不能与 -R-L-Z-f 一起指定。

-l

所有大写字符都将转换为小写字符。禁用大写字母选项 -u

-L

向左调整 value,并删除其中的前导空格。如果 n非零,则定义字段宽度,否则根据第一个赋值的值的宽度确定字段宽度。如果为此变量赋值,则会根据需要使用空格填充此值的右侧或者截断此值,使其适合此字段。禁用 -R 选项。 -i 属性无法与 -L 一起指定。

-n

vname 声明为对某个变量的引用,此变量的名称根据变量 vname 的值定义。这通常用于引用函数中其名称作为参数传递的变量。

-R

向右调整,并使用前导空格填充。如果 n非零,则定义字段宽度,否则根据第一个赋值的值的宽度确定字段宽度。如果重新为此变量赋值,则会使用空格填充此字段的左侧,或者截断此字段的末尾。禁用 -L 选项。 -i 属性无法与 -R 一起指定。

-r

指定 vname 标记为只读,后续赋值不能更改这些名称。

-t

标记变量。用户可以定义标记,对 shell 而言,这些标记没有任何特殊意义。

-u

所有小写字符都将转换为大写字符。禁用小写字母选项 -l

-x

标记指定 vname,以便自动导出到随后执行的命令的环境。无法导出其名称包含 . 的变量。

-Z

如果第一个非空字符为数字,并且未设置 -L 选项,则会向右调整,并使用前导零进行填充。如果同时设置了 -L 选项,则删除前导零。如果 n非零,则定义字段宽度,否则根据第一个赋值的值的宽度确定字段宽度。 -i 属性无法与 -Z 一起指定。

ulimit [-HSacdfmnpstv] [ limit]

设置或显示资源限制。许多系统都不支持一个或多个这些限制。如果指定了 limit,则会设置指定资源的限制。limit 的值可以是一个数字(采用随各资源指定的单位为单位),也可以为值 unlimited。如果指定了多种资源,则会在值之前输出限制名称及单位。 如果未指定任何选项,则采用 -f。 下面列出了一些可用的资源限制:

-a

列出当前的所有资源限制。

-c

核心转储大小中的 512 字节块的数目。

-d

数据区域大小中的千字节数目。

-f

当前进程或子进程可写入的文件中的 512 字节块的数目(可以读取任意大小的文件)。

-H

指定指定资源的硬限制。 硬限制一旦设置便不能增加。 如果未指定 -H-S 选项,此限制同时适用于两个选项。如果省略了 limit,则会输出当前资源限制。此种情况下,除非指定 -H,否则将输出软限制。

-m

物理内存大小中的千字节数目。

-n

文件描述符数目加 1。

-p

用于管道缓冲的 512 字节块的数目。

-s

堆栈区域大小中的千字节数目。

-S

指定指定资源的软限制。 软限制最多可增加至硬限制的值。 如果未指定 -H-S 选项,此限制同时适用于两个选项。如果省略了 limit,则会输出当前资源限制。此种情况下,除非指定 -H,否则将输出软限制。

-t

各进程使用的 CPU 秒数。

-v

用于虚拟内存的千字节数目。

umask [-S][mask]

用户文件创建掩码设置为 maskmask 可以是八进制数字或符号值,如 chmod(1) 所述。 如果指定了符号值,新 umask 值即为对以前的 umask 值的补数应用 mask 的结果的补数。如果省略了 mask,则会输出掩码的当前值。-S 选项导致将模式输出为符号值。否则输出八进制掩码。 请参见 umask(2)

+unalias [-a] name

从别名列表中删除 name 列表指定的别名。-a 选项导致取消设置所有别名。

+unset [-fnv] vname

未分配 vname 列表指定的变量,即,已清除这些变量的值和属性。无法取消设置只读变量。如果设置了 -f 选项,名称则引用函数名称。如果设置了 -v 选项,名称则引用变量名称。-f 选项可覆盖 -v。如果设置了 -n,并且 name 为名称引用,则会取消设置 name(而非其引用的变量)。缺省值等效于 -v。取消设置 LINENOMAILCHECKOPTARGOPTINDRANDOMSECONDSTMOUT_ 将删除其特殊含义,即使在随后对这些变量赋值也是如此。

wait [job]

等待指定作业,并报告其终止状态。如果未指定 job,则等待当前处于活动状态的所有子进程。如果指定了 job,此命令的退出状态即为等待的最后一个进程的退出状态;否则为零。请参见 Jobs 了解 job 格式的说明。

whence [-afpv] name ...

对于每个 name,此命令指示将其用作命令名称时的解释方式。-v 选项生成更详细的报告。-f 选项跳过函数搜索。即使名称为别名、函数或保留字,-p 选项也会针对 name 进行路径搜索。-a 选项与 -v 选项相似,但前者导致报告指定名称的所有解释。

"调用"

如果使用 exec(2) 调用 shell,并且参数的第一个字符 0 ($0) 为 -,则假定此 shell 为登录 shell,并从 /etc/profile 读取命令,然后从 $HOME/.profile 中读取命令。接着,对于交互式 shell,首先从 /etc/ksh.kshrc 读取命令,然后从通过对环境变量 ENV 的值执行参数扩展、命令替换和算术替换进行命名的文件中读取命令(如果存在此文件)。如果 -s 选项不存在,并且存在 arg 以及名为 arg 的文件,则会读取和执行此脚本。否则,如果第一个 arg 不包含 /,则会对第一个 arg 执行路径搜索,以便确定要执行的脚本的名称。脚本 arg 必须具有执行权限,并且忽略任何 setuidsetgid 设置。如果未在此路径中找到脚本,则会处理 arg,就像指定了内置命令或函数一样。

然后按照说明读取命令,并且 shell 会在调用时解释下列选项:

-c

如果存在 -c 选项,则从第一个 arg 读取命令。其余所有参数都将成为从 0 开始的位置参数。

-D

标准输出中将输出前面带有 $ 且包含在双引号中的所有字符串的列表,并且 shell 退出。当语言环境不是 C 或 POSIX 时,此组字符串则会转换为相应语言。不会执行任何命令。

-i

如果存在 -i 选项,或者如果将 shell 输入和输出附加到终端(根据 tcgetattr(3C) 的指示),此 shell 则为交互式 shell。此种情况下,将忽略 TERM(因此,kill 0 不会中止交互式 shell),并捕获和忽略 INTR(因此,可以中断等待)。在所有情况下,shell 将忽略 QUIT

-R filename

-R filename 选项用于生成交叉引用数据库,此数据库可供单独的实用程序用于查找变量和命令的定义及引用。

-r

如果存在 -r 选项,shell 则为受限 shell。

-s

如果存在 -s 选项,或者如果未保留任何参数,则从标准输入读取命令。Shell 输出(列出的特殊命令的输出除外)写入到文件描述符 2。

其余选项和参数在 set 命令下说明。忽略作为第一个参数的可选 -

"仅适用于 rksh"

rksh 用于设置登录名和执行环境,其功能比标准 shell 的功能更受约束。

rksh 的操作与 ksh 的操作相同,但前者不允许以下操作:

取消设置受限选项

更改目录。请参见 cd(1)。

设置或取消设置 SHELLENVFPATHPATH 的值或属性

指定包含 / 的路径或命令名称。

重定向输出(>>|<>>>)。

添加或删除内置命令。

使用 command -p 调用命令。

在解释 .profileENV 文件后强制这些限制。

如果发现要执行的命令为 shell 过程,rksh 则会调用 ksh 来执行此命令。因此,可以向最终用户提供有权访问标准 shell 的完整功能的 shell 过程,并强制有限的命令菜单。此方案假定最终用户没有同一目录的写入和执行权限。这些规则的实际结果是,通过执行保证的设置操作,并将用户保留在适当的目录(可能不是登录目录)中,.profile 的写入者具有用户操作的完整控制权。系统管理员通常设置可由 rksh 安全调用的命令目录(例如,/usr/rbin)。

用法

有关在遇到大小大于或等于 2 GB(2^31 字节)的文件时 kshrksh 的行为的说明,请参见 largefile(5)。

退出状态

将返回以下退出值:

非零

当 shell 检测到错误(如语法错误)时,返回非零。 如果以非交互方式使用 shell,除非子 shell 中出现错误(此种情况下将放弃子 shell),否则会放弃执行此 shell 文件。

执行的最后一个命令的退出状态

返回执行的最后一个命令的退出状态。 通过输出命令或函数名称以及错误状态,报告 shell 检测到的运行时错误。如果出现错误的行号大于 1,则还会在命令或函数名称后面的方括号 ([]) 中输出此行号。 有关其他详细信息,请参见 ksh exit 命令。

文件

/etc/profile

系统初始化文件,针对 login shell 执行。

/etc/ksh.kshrc

系统级启动文件,针对交互式 shell 执行。

$HOME/.profile

专用初始化文件,在 /etc/profile 后针对登录 shell 执行。

$HOME/.kshrc

缺省专用初始化文件,当未设置 ENV 时,在 /etc/ksh.kshrc 后针对交互式 shell 执行。

/etc/suid-profile

备用初始化文件,在实际和有效用户或组 ID 不匹配时代替专用初始化文件执行。

/dev/null

空设备。

作者

David Korn,dgk@research.att.com

属性

有关下列属性的描述,请参见 attributes(5):

属性类型属性值
可用性system/core-os
接口稳定性参见下文。

脚本接口是 "Uncommitted"(未确定)。环境变量、.paths 功能以及编辑模式是 Volatile(可变)接口。

另请参见

cat(1)、cd(1)、chmod(1)、cut(1)、date(1)、egrep(1)、echo(1)、egrep(1)、env(1)、fgrep(1)、grep(1)、login(1)、newgrp(1)、paste(1)、printf(1)、shell_builtins(1)、stty(1)、test(1)、umask(1)、vi(1)、dup(2)、exec(2)、fork(2)、ioctl(2)、lseek(2)、pathconf(2)、pipe(2)、sysconf(3C)、ulimit(2)、umask(2)、rand(3C)、tcgetattr(3C)、wait(3C)、a.out(4)、profile(4)、attributes(5)、environ(5)、largefile(5)、standards(5)

由 Bolsky, Morris I. 和 Korn, David G. 合住的The New K rnS ell Comma d and P ogr mming Langu ge,Prentice Hall 出版,1995。

POSIX-Part 2: Shell and Utilities, IEEE Std 1003.2-1992, ISO/IEC 9945-2, IEEE, 1993.

附注

ksh 脚本应选择 ISO C99、C++ 和 JAVA 语言的保留字所使用的名称空间之外的 shell 函数名称,以免与 ksh 的将来改进冲突。

如果执行命令,并在搜索路径中原始命令所在目录之前的目录中安装同名命令,shell 会继续执行原始命令。使用 alias 命令的 -t 选项可以更正此情况。

某些很早的 shell 脚本包含插入记号 (^),并将其用作管道字符 (|) 的同义词。

在复合命令中使用 hist 内置命令会导致 whole 命令从历史文件中消失。

内置命令 . file 在执行任何命令之前读取整个文件。文件中的 aliasunalias 命令不适用于该文件中定义的所有命令。

当作业正在等待前台进程时,不会处理陷阱。因此,在前台作业终止之前,不会执行 CHLD 中的陷阱。

最好在算术表达式中的逗号运算符后保留一个空格,以免在特定语言环境中将逗号解释为小数点字符。

创建 .paths 文件可能存在一些限制,该文件可移植到其他操作系统中。

如果系统支持 64 位指令集,/bin/ksh 将执行 ksh 的 64 位版本。