手册页部分 1: 用户命令

退出打印视图

更新时间: 2014 年 7 月
 
 

set(1)

名称

set , unset , setenv , unsetenv , export - shell 内置函数,用于确定当前 shell 及其后代的环境变量特征。

用法概要

sh

set [--aefhkntuvx [argument ]]...
unset [name]...
export [name]...

csh

set [var [=  value]]
set var [n] =  word
unset pattern
setenv [VAR [ word]]
unsetenv variable

ksh88

set [±abCefhkmnopstuvx] [±o  option]... [±A name] [arg]...
unset [-f] name... 
**export [name [= value]]...
**export [-p]

ksh

+set [±abCefGhkmnoprstuvx] [±o  option]... [±A vname] [arg]...
+unset [-fnv] vname... 
++export [-p] [name[= value]]...

描述

sh

set 内置命令具有以下选项:

–-

不更改任何标志。在将 $1 设置为 时,此选项非常有用。

–a

标记已修改或创建的变量以便导出。

–e

当命令以非零退出状态退出时立即退出。

–f

禁用文件名生成。

–h

在定义函数时查找并记住函数命令。函数命令的位置通常在执行函数时确定。

–k

将所有关键字参数放在命令的环境中,而不仅仅是命令名称前面的参数。

–n

读取命令,但不执行这些命令。

–t

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

–u

替换时将 unset 的变量视为错误。

–v

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

–x

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

使用 +(而非 )将导致禁用这些标志。此外,还可以在调用 shell 时使用这些标志。当前标志集可在 $− 中找到。其余的 argument 属于位置参数,将按顺序分配到 $1$2 . . . 。如果未指定任何 argument,将输出所有名称的值。

对于每个 nameunset 将删除对应的变量或函数值。变量 PATH、 PS1、PS2、MAILCHECK 和 IF 无法取消设置。

通过内置 export,为特定 name 添加标记,以便自动导出到随后执行命令所在的 environment 中。如果未指定任何参数,将列出当前执行 shell 期间已标记为导出的变量名称。函数名称不会导出。

csh

未指定参数时,set 将显示所有 shell 变量的值。多词值将显示为带括号的列表。单独指定了 var 参数时,set 会将一个空值赋给变量 var。通过使用格式为 var = value 的参数,setvalue 分配给 var,其中 value 是以下之一:

word

单个词(或括在引号中的字符串)。

(wordlist )

括在括号中的以空格分隔的词列表。

Value 是在赋值前将展开的命令和文件名。set var[ n]=word 的格式将使用 word 替换多词值中的第 n 个词。

unset 将删除名称与 pattern 匹配(文件名替换)的变量。使用 `unset *' 将删除所有变量。

未指定参数时,setenv 将显示所有环境变量。使用 VAR 参数,setenv 可将环境变量 VAR 设置为空值 (Null)(根据约定,通常要为环境变量指定大写字母的名称)。同时指定 VAR word 参数,setenv 可将 VAR 设置为 word,该参数必须是单个词或带引号的字符串。PATH 变量可以使用多个 word 参数,各参数以冒号分隔(请参见“示例”部分)。最常用的环境变量 USER、 TERM 和 PATH 会自动从 csh 变量 usertermpath 中导出和导入。如需更改这些变量,请使用 setenv。此外,每当 csh 变量 cwd 改变时,shell 都会根据它设置 PWD 环境变量。

在 C shell 中更改环境变量 LC_CTYPE、LC_MESSAGES、 LC_TIME、LC_COLLATE、LC_NUMERIC 和 LC_MONETARY 时,这些变量将立即生效。有关这些环境变量的说明,请参见 environ(5)

unsetenv 将删除环境中的 variable。与使用 unset 时一样,不会执行模式匹配。

ksh88

内置 set 的标志具有以下含义:

–A

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

–a

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

–b

使 shell 以异步方式将后台作业完成情况通知用户。

–C

防止现有文件被 shell 的 > 重定向运算符覆盖。>| 重定向运算符会覆盖单个文件的此 noclobber 选项。

–e

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

–f

禁用文件名生成。

–h

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

–k

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

–m

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

–n

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

+o

以适合的格式将当前的选项设置写入标准输出,以便作为命令重新输入 shell 来实现相同的选项设置。

–o option

option 参数可以为下列选项名称之一:

allexport

–a 相同。

errexit

–e 相同。

bgnice

以较低的优先级运行所有后台作业。这是缺省模式。通过 emacs 可进入 emacs 样式的内嵌编辑器来输入命令。

gmacs

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

ignoreeof

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

keyword

–k 相同。

markdirs

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

monitor

–m 相同。

noclobber

阻止重定向运算符 > 截断现有文件。启用时,需要使用 >| 运算符才能截断文件。与 –C 相同。

noexec

–n 相同。

noglob

–f 相同。

nolog

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

notify

–b 相同。

nounset

–u 相同。

privileged

–p 相同。

verbose

–v 相同。

trackall

–h 相同。

vi

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

viraw

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

xtrace

–x 相同。

如果不提供选项名称,将输出当前的选项设置。

–p

禁用 $HOME/.profile 文件的处理操作,并使用文件 /etc/suid_profile(而非 ENV 文件)。当有效 UID 不等于实际 UID 时或者有效 GID 不等于实际 GID 时,将启用此模式。禁用此模式会导致将有效 UID 和 GID 设置为实际 UID 和 GID。

–s

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

–t

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

–u

替换时会将未设置的参数视为错误。

–v

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

–x

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

关闭 –x–v 标志,并停止检查参数的标志。

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

使用 +(而非 )将导致禁用这些标志。此外,还可以在调用 shell 时使用这些标志。当前标志集可在 $− 中找到。除非指定了 –A,否则其余参数都是位置参数,并将按顺序分配给 $1 $2 . . 。如果不指定参数,则在标准输出中输出所有变量的名称和值。

name 列表指定的变量将被取消分配,也就是说,它们的值和属性将被清除。readonly 变量无法取消设置。如果设置了 –f 标志,name 是指 function 的名称。取消设置 ERRNOLINENOMAILCHECKOPTARGOPTINDRANDOMSECONDSTMOUT_ 将删除它们的特殊含义,即使随后指定了这些变量也是如此。

使用 unset 时,name 列表指定的变量将被取消分配,即这些变量的值和属性将被清除。readonly 变量无法取消设置。如果设置了 –f 标志,name 是指 function 的名称。取消设置 ERRNOLINENOMAILCHECKOPTARGOPTINDRANDOMSECONDSTMOUT_ 将删除它们的特殊含义,即使随后指定了这些变量也是如此。

通过内置的 export 操作,可以为指定的名称添加标记,以便自动导出到随后执行的命令所在的环境

指定 –p 时,export 按以下格式将所有导出变量的名称和值写入到标准输出中:

"export %s=%s\n", name, value

如果 name 已设置并且:

"export %s\n", name

如果 name 未设置。

shell 会设置输出的格式,包括适当使用引号,以便适合作为实现相同导出结果的命令重新输入 shell,但以下情况除外:

  1. 无法重置带值的只读变量。

  2. 如果在保存状态时以及将保存的输出重新输入 shell 时之间为变量分配一个值,则输出时取消设置的变量不能重置为取消设置状态。

在本手册页上,前面带有一个或两个 *(星号)的 ksh88(1) 命令将专门通过以下方式进行处理:

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

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

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

  4. 如果字的后面是前面加有 ** 的命令且字为变量赋值的格式,则使用与变量赋值相同的规则扩展这些字。这表示在 = 符号之后执行波浪号替换,并且不执行字拆分和文件名生成。

ksh

set 可设置或取消设置选项和位置参数。如果为选项指定了 -,则表示要设置这些选项。如果为选项指定了 +,则表示要取消设置这些选项。

未指定任何选项或参数的 set 将按当前区域设置中的整理序列显示所有 shell 变量的名称和值。这些值将用括号括起,以便适合重新输入到 shell。

如果不指定任何参数(甚至不指定选项参数的结尾 --),位置参数将保持不变。除非指定了 –A 选项,否则位置参数将替换为参数列表。在设置位置参数时,第一个 -- 参数将被忽略。

为了向后兼容性,不指定任何选项的 set 命令(其第一个参数为 -)将禁用 –v–x 选项。如果指定了任何额外的参数,它们将替换位置参数。

ksh 中要设置的选项包括:

–a

为每个名称中不包含 a .(已在当前 shell 环境中指定了某个值)的变量设置导出属性。

–A name

将参数按顺序分配给名为 name(以下标 0 开头)的数组,而不分配给位置参数。

–b

一旦检测到有后台作业已完成,shell 就会将消息写入标准错误,而不是等待下一提示。

–B

启用 {...} 组扩展。缺省情况下为启用状态。

–C

防止使用 > 重定向运算符覆盖现有常规文件。>| 重定向运算符将覆盖此 noclobber 选项。

–e

处于非零退出状态的简单命令会导致 shell 退出,除非该简单命令:

  • 包含在 &&|| 列表中

  • 紧跟在 if whileuntil 之后

  • 包含在管道中并后跟 !

–f

路径名扩展已禁用。

–G

使 ** 本身也与路径名扩展期间的所有子目录匹配。

–h

已过时。使名称中包含别名语法的每个命令在第一次遇到时变为被跟踪别名。

–H

启用与 csh 类似的 ! 样式的历史记录扩展。

–k

此选项已过时。所有采取 name = value 这种形式的参数将被删除,并放入命令的变量赋值列表中。通常,变量赋值必须位于命令参数之前。

–m

启用之后,shell 将在单独的进程组中运行后台作业,并在完成时显示一行。在支持作业控制的系统上,缺省情况下为交互式 shell 启用此模式。

–n

shell 将读取命令并检查是否存在语法错误,但不会执行命令。通常在调用命令时指定。

–o [option]

如果不指定选项,选项及其当前设置的列表将写入到标准输出。当使用 + 进行调用时,选项将以一种可再次输入 shell 的格式写入,以便恢复设置。重复此选项可以启用或禁用多个选项。

option 的值必须为下列值之一:

allexport

–a 相同。

bgnice

以较低的优先级运行所有后台作业。

braceexpand

–B 相同。

emacs

启用或禁用 emacs 编辑模式。

errexit

–e 相同。

globstar

等效于 –G

gmacs

启用或禁用 gmacs。除了对 CTRL-T 的处理方式不同以外,gmacs 编辑模式与 emacs 编辑模式相同。

histexpand

–H 相同。

ignoreeof

交互式 shell 不在文件结尾退出。

keyword

–k 相同。

markdirs

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

monitor

–m 相同。

multiline

编辑长度超过窗口宽度的行时使用多行显示。

noclobber

–C 相同。

noexec

–n 相同。

noglob

–f 相同。

nolog

无作用。仅用于实现向后兼容性。

notify

–b 相同。

nounset

–u 相同。

pipefail

所有管道组件完成后,才会完成管道。而且,管道的退出状态将是最后一个以非零退出状态退出的命令的值。如果所有命令均返回零退出状态,则管道的退出状态将为

privileged

–p 相同。

showme

将跟踪前缀为 ; 的简单命令,跟踪方式与已启用但未执行 –x 的情况相同。

trackall

–h 相同。

verbose

–v 相同。

vi

启用或禁用 vi 编辑模式。

viraw

不在使用 vi 编辑模式时使用标准输入模式。

xtrace

–x 相同。

–p

特权模式。禁用 –p 会将有效用户 ID 设置为实际用户 ID,将有效组 ID 设置为实际组 ID。启用 –p 会将有效用户 ID 和有效组 ID 恢复为调用 shell 时的值。每当实际用户 ID 和有效用户 ID 不相等或实际组 ID 和有效组 ID 不相等时,都将启用 –p 选项。当 –p 为启用状态时,不会处理用户配置文件。

–r

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

–s

对位置参数进行排序

–t

已过时。shell 将读取一个命令,然后退出。

–u

如果启用,shell 将在尝试扩展已取消设置的变量时显示一条错误消息。

–v

详细模式。shell 将在读取时将它的输入显示为标准错误。

–x

执行跟踪。shell 将在所有扩展完成之后、执行之前显示每个命令,命令前面带有扩展的 PS4 参数值。

ksh 中的 set 将返回以下退出值:

0

成功完成。

>0

出现错误。

对于指定的每个名称,unset 将从当前 shell 执行环境中取消设置变量或函数(如果指定了 –f)。无法取消设置只读变量。

kshunset 的选项包括:

–f

name 表示函数名称时,shell 将取消设置函数定义。

–n

如果 name 表示一个作为引用项的变量,将取消设置变量 name,而不是它所引用的变量。否则,此选项等效于 –v 选项。

–v

name 表示的是变量名称时,shell 将取消设置该变量名称,并将其从环境中删除。这是缺省行为。

ksh 中的 unset 将返回以下退出值:

0

成功完成。已成功取消设置所有名称。

>0

出现错误,或无法取消设置一个或多个 name 操作数

export 命令将对每个通过名称指定的变量设置导出属性,以便将其导出到随后执行的命令的环境。如果指定了 =value,则会将变量 name 设置为 value

如果不指定任何 name,所有导出的变量的名称和值将写入到标准输出。

export 作为声明命令内置在 shell 中,因此不会对参数执行字段分隔和路径名扩展操作。值会发生波浪号扩展。

kshexport 的选项包括:

–p

使输出采用 export 命令的形式,以便可以作为 shell 的输入用于重新创建当前的导出。

ksh 中的 export 将返回以下退出值:

0

成功完成。

>0

出现错误。

在本手册页上,前面带一个或两个 +ksh(1) 命令将专门通过以下方式进行处理:

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

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

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

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

  5. 如果字的后面是前面加有 ++ 的命令且字为变量赋值的格式,则使用与变量赋值相同的规则扩展这些字。这意味着将在 = 符号之后执行波浪号替换,并且不执行字段分割和文件名生成。

示例

csh

以下示例设置了 PATH 变量,以便按以下顺序依次在 /bin/usr/bin/usr/sbin 目录中搜索文件:

setenv PATH "/bin:/usr/bin:/usr/sbin"

属性

有关下列属性的说明,请参见 attributes(5)

属性类型
属性值
可用性
system/core-os

另请参见

csh(1)ksh(1)ksh88(1)read(1)sh(1)typeset(1)attributes(5)environ(5)