5.Shell变量
本章介绍 shell 中所使用的变量。Bash 会自动给其中一些变量赋默认值。
5.1 波恩Shell的变量
Bash 使用一些和波恩 shell 同样的变量。有时,Bash 会给它赋默认值。
CDPATH 冒号分隔的一组目录名,用作内部命令 cd 的搜索路径。
HOME 当前用户的主目录,也是内部命令 cd 的默认值。这个变量的值还用在波浪号扩展中。
IFS 用来分隔字段的亄组字符;在扩展时,shell 用它来拆分单词。
MAIL 如果这个变量设为一个文件名,并且没有设置 MAILPATH 变量,Bash 将通知用户在指定文件中有新邮件。
MAILPATH 冒号分隔的一级文件名,shell 会定期在这些文件中检查新邮件。每个文件名都可以名称后面用“?”分隔,然后指定一条消息,当新邮件到达时将把这条消息打印出来。在消息文本中,$_扩展成当前邮箱文件名。
OPTARG 内部命令 getopts 处理的构后一个选项。
OPTIND 内部命令 getopts 处理的构后一个选项参数。
PATH 冒号分隔的一组目录,shell 用它来搜索命令。长度为零的(空目录)目录名表示当前目录,它可以 作为两个连在一起的冒号出现,也可以作为开始或结束的冒号出现。
PS1 主提示符,它的默认值是"s-v$ "。关于在显示 PS1 之前就被扩展的转义序列完整列表,请参6.9提示符的控制 。
PS2 第二提示符。默认值是"> "
5.2 Bash的变量
下面的变量是 Bash 设置和使用的,但是其它 shell 通常都不会对它们进行特殊处理。
有些 Bash 变量在其它章节中介绍,例如作业控制所使用的变量。
BASH 执行当前 Bash 所用的完整路径。
BASHPID 扩展为当前 Bash 进程的进程号。在有些情况下,这和 $$ 是不同的;例如子 shell 中,这时 Bash 不会重新初始化。
BASH_ALIASES 一个键值数组变量,其中的元素和内部命令 alias 所维护的别名列表相对应。这个数组中添加的元素将也出现在别名列表中;而删除元素将会同时删除别名列表中的别名。
BASH_ARGC 一个数组变量,其中的元素是当前 Bash 的执行栈中每个帧里面的参数个数。当前子程序(即shell 函数,或者用 . 或 source 执行的 shell 脚本)的参数个数在栈的顶端。
执行子程序时,转递给它的参数个数被压入 BASH_ARGC 数组。只有 shell 运行在扩展的调试模式中才会设置这个数组。
BASH_ARGV 一个数组变量,包含当前 Bash 的执行栈中的所有变量。朂后一个子程序调用的最后一个参数在栈的顶端,而第一个子程序调用的第一个参数在栈的底部。
在执行子程序时,向它传递的参数被压入到 BASH_ARGV 中。只有 shell 运行在扩展的调试模式中才会设置这个数组。
BASH_CMDS 一个键值数组变量,其中的元素和内部命令 hash 所维护的命令散列表相对应。这个数组中添加的元素将也出现在散列表中;而删除元素将会同时删除散列表中的命令。
BASH_COMMAND 当前正在或即将执行的命令。如果这个命令是从属于陷阱,则表示触引发陷阱的命令。
BASH_ENV 如果在启动 Bash 来执行一个 shell 脚本时设置了这个变量,它的值就会在执行脚本前被扩展并当作初始化文件来读取。
BASH_EXECUTION_STRING 启动选项"-c"的命令参数。
BASH_LINENO 一个键值数组变量,其中的元素是与每个 FUNCNAME 对应的源文件中的行号。${BASH LINENO[$i]} 是源文件中调用 ${FUNCNAME[$i]} 地方的行号
(如果是在其它 shell 函数中调用,则是 ${BASH LINENO[$i-1]}), 而对应的源文件名是 ${BASH SOURCE[$i]}。可以用 LINENO 来获得当前的行号。
BASH_REMATCH 一个数组变量,其中的元素由条件结构命令 [[ 的双目运算符"=~"来赋值。下标为 0 的元素是字符串中与整个正则表达式匹配的部分;下标为 n 的 元素是字符串中与第 n 个括号中的子模式匹配的部分。这个变量是只读的。
BASH_SOURCE 一个数组变量,其中的元素是与数组变量 FUNCNAME 中元素对应的源文件名。
BASH_SUBSHELL 每次创建一个子 shell 或子 shell 环境中都把这个变量增加一。它的初始值是 0。
BASH_VERSINFO 一个只读数组变量,其中的元素保存了当前 Bash 的版本信息。 元素的值如下:
BASH_VERSINFO[0] 主版本号(发布号)。
BASH_VERSINFO[1] 次版本号(版本号 BASH_VERSION)。
BASH_VERSINFO[2] 补丁级别。
BASH_VERSINFO[3] 编译版本号。
BASH_VERSINFO[4] 发布状态 (例如:betal)。
BASH_VERSINFO[5] MACHTYPE 的值。
BASH_VERSION 当前 Bash 的版本号。
COLUMNS 内部命令 select 在打印待选列表时用它来决定终端的宽度。它会在接收到 SIGWINCH 信号时自动改变。
COMP_CWORD 在包含当前光标位置的单词 ${COMP_WORDS} 中的下标。这个变量只能在可编程补全的 shell 函数中使用。
COMP_LINE 当前的命令行。这个变量只能在可编程补全的 shell 函数中使用。
COMP_POINT 当前光标位置相对于当前命令行开头的下标。如果当前光标位置在当前命令行的尾部,则这个变量的值就与 ${#COMP LINE} 相同。这个变量只能在可编程补全的 shell 函数中使用。
COMP_TYPE 一个整数值,与触发调用补全函数时试图进行补全的类型相对应:正常补全时为 TAB,连续 输入制表符后的补全列表为 ?,列出其它部分补全条目时为 !,没有修改单词而列出补全条目时为 @, 补全菜单时为 %。这个变量只能在可编程补全的 shell 函数中使用。
COMP_KEY 触发当前补全函数的键(或键序列中的最后一个键)。
COMP_WORDBREAKS Readline 库进行单词补全时用作单词分隔的字符。如果没有设置这个变量,它就会失去特殊作用,即使以后再设置。
COMP_WORDS 一个数组变量,包含当前命令行的每个单词。当前行被上面所说的 COMP_WORKBREAKS 拆分成单词,和Readline的方式一样。这个变量只能在可编程补全的 shell 函数中使用。
COMPREPLY 一个数组变量;Bash 从这个变量中读取可编程补全所调用的 shell 函数生成的补全条目。
DIRSTACK 一个数组变量,包含了当前目录栈的内容。目录在栈中按照内部命令 dirs 所显示的顺序保存。
可以通过对这个数组中元素赋值来修改栈中已有的目录,但必须用 pushd 或 popd 才能删除栈中的目录。
对这个变量赋值不会改变当前目录。如果没有设置这个变量,则它就会失去其特殊作用,即使以后再设置。
EMACS 如果 Bash 启动时在环境中有这个变量并且其值为"t",就会认为它正在emacs的 shell 缓存中运行,并禁止行编辑。
EUID 当前用户的有效用户号。这个变量是只读的。
FCEDIT 内部命令 fc 带有"-e"选项时默认要使用的编辑器。
FIGNORE 进行文件名扩展时要忽略的冒号分隔的后缀。如果一个文件名的后缀和这个变量某个条目匹配,它就不会出现在匹配的文件名列表中。例如,它可以取值为".o:~"。
FUNCNAME 一个数组变量,包含当前执行栈中所有 shell 函数的名称。下标为 0 的元素是当前正在执行的 shell 函数;而栈底是"main"。
这个变量只有在执行 shell 函数时才有。对 FUNCNAME 赋值不会生效并且会返回一个错误状态。
如果没有设置这个变量,它就会失去特殊作用,即使以后再设置。
GLOBIGNORE 冒号分隔的一组模式,它定义了文件名扩展时所要忽略的文件名。在文件名扩展中,如果匹配了一个文件名,而这个文件名又和 GLOBIGNORE 中的一个模式匹配,则它将被从匹配列表中删除。
GROUPS 一个数组变量,包含当前用户所属的用户组。对 GROUPS 赋值不会生效并且会返回一个错误的状态。如果没有设置这个变量,它就会失去其特殊作用,即使以后再设置。
histchars 不超过三个字符,用来控制历史扩展、快速替换、符号化。
其中的第一个是历史扩展字符,即表示历史扩展录始的字符,它通常是"!"。
第二个字符如果出现在行的开头,则表示要进行"快速替换",它通常是"^"。
第三个字符是可选的,它如果是一个单词的第一个字符,就表示本行中剩余的部分是注释;它通常是"#"。
历史注释字符使得历史替换忽略本行中剩余的单词;而不一定表示 shell 解释器会把剩余部分当成注释。
HISTCMD 历史号,即当前命令在历史中的索引号。如果没有设置这个变量,它就失去特殊的作用,即使以后再设置。
HISTCONTROL 冒号分隔的一组值,它控制命令怎么在历史中保存。如果值中包含"ignorespace", 则不在历史中保存以空格开头的行。
值为"ignoredups"表示不保存与前一历史条目匹配的行。 值"ignoreboth"是"ignorespace"和"ignoredups"两者的简写。
值"erasedups"表示在保存本行时首先删除与本行匹配的前一行。此外的所有值都会被忽略。
如果没有设置这个变量,或它不包含有效的值,则 shell 解释器会根据 HISTIGNORE 的值在历史中保存所有读取的行。
多行命令的第二行和其余行不会进行如上的检测,不管这个变量如何设置都会保存到历史中。
HISTFILE 用来保存命令历史的文件,默认值是 ~/.bash history。
HISTFILESIZE 历史文件中包含的最多行数。如果给这个变量赋值,历史文件就会在必要时删除最早的记录,以保证不超过指定的行数。
当交互式的 shell 退出运行时也会删除这个文件中的最早记录并只保留不超过指定的行数。这个变量的默认值是500。
HISTIGNORE 冒号分隔的一组模式,用以决定哪些命令可以保存在历史中。每个模式都定位在行的开头,必须和整行匹配(没有隐式加上"*")。
在进行 HISTCONTROL 指定的检查后,每个模式都会和当前行匹配。
除了 shell 中通常的模式匹配字符,还可以用"&"来匹配历史中的前一行。
如果用使用"&"本身,可以用反斜杠转义;在匹配之前,这个反斜杠将被删除。
多行命令的第二行和其余行不会进行检测,不管这个变量如何设置都会保存到历史中。
HISTIGNORE 包括了 HISTCONTROL 的功能。
"&"模式与ignoredups是等价的,而"[ ]*"模式和ignorespace是等价的。把这两个模式用冒号连接起来就和ignoreboth是等价的。
HISTSIZE 历史中保存的最多命令个数。默认值是 500。
HISTTIMEFORMAT 如果设置了这个变量且不为空,它的值将用作 strftime 的格式字符串,并被内部命令 history 显示历史条目时打印每条历史的时间戳。
如果设置了这个变量,时间戳也会写入到历史文件中以便在不同的 shell 会话中保留这些信息。它使用历史注释字符以便把时间戳和其它历史行区别开来。
HOSTFILE 指定一个格式与 /etc/hosts 相同的文件,以便 shell 补全主机名时使用。在 shell 运行时可以更改主机名补全的条目。
改变这个值后再进行主机名补全时,Bash 会把新文件中的内容加入到已有的列表中。
如果设置了这个变量却没有指定值,Bash 就试图读取 /etc/hosts 来获得主机名补全的条目。如果重置这个变量,就会清空主机名列表。
HOSTNAME 当前主机的名称。
HOSTTYPE 一个字符串,它描述了运行 Bash 的机器的类型。
IGNOREEOF 控制着 shell 读取到 EOF 字符作为整个输入时的行为。如果设置了,它的值表示连续 EOF 字符的个数;如果 shell 输入的行首有这么多EOF,就会退出。
如果设置了这个变量,而其值却不是数值(或没有值),则默认为 10。如果这个变量不存在,EOF字符就表示 shell 输入的结束。这只有在交互式的 shell 中才有效。
INPUTRC Readline 初始化文件的名称,用来覆盖默认值 ~/.inputrc。
LANG 用来指定语类别,如果这个类别没有特别地用 LC_ 开头的变量指定。
LC_ALL 这个变量覆盖 LANG 和所有其它 LC_ 变量指定的语言类别。
LC_COLLATE 这个变量决定文件名扩展结果的排序顺序,以及文件名扩展和文件名匹配中的范围表达式、 等价字符类、语 区域序列。
LC_CTYPE 这个变量决定文件名扩展和模式匹配中对字符的解释和字符类的行为。
LC_MESSAGES 这个变量决定翻译 $ 后面的双引用字符串时所使用的语言区域。
LC_NUMERIC 这个变量决定格式化数字时所使用的语言区域。
LINENO 当前执行的脚本或 shell 函数中的行号。
LINES 内部命令 select 在打印待选条目时所用的列宽度。这个值会在接收到 SIGWINCH 信号后自动更新。
MACHTYPE 对正在运行 Bash 的系统,一个能完整描述系统类型的字符串,它的格式是 GNU 标准 的"CPU-COMPANY-SYSTEM"。
MAILCHECK shell 检查邮件的频度(以秒为单位),邮件存放在 MAILPATH 或 MAIL 变量指定的文件中。默认值是 60 秒。
到达检查邮件的时间时,shell 会先检查邮件再显示主提示符。如果这个变量没有设置, 或设为一个不是大于或等于零的数,则 shell 就禁用邮件检查。
OLDPWD 内部命令 cd 所设置的以前工作目录。
OPTERR 设为 1,Bash 会显示内部命令 getopts 所产生的错误。
OSTYPE 一个字符串,描述了正运行 Bash 的操作系统的类型。
PIPESTATUS 一个数组变量,包含最近在前台执行的管道中进程的退出状态。
POSIXLY_CORRECT 如果 Bash 启动时这个变量在环境中,shell 就会在读取初始化文件之前进入POSIX模式,就好像指定了"--posix"启动选项一样。
如果在 shell运行中设置这个变量,Bash 也会进入POSIX 模式,就好像执行了 set -o posix 命令一样。
PPID shell 父进程的进程号。这个变量是只读的。
PROMPT_COMMAND 如果设置了,它的值就被当作每次显示主提示符($PS1)之前要执行的命令。
PROMPT_DIRTRIM 如果设为一个大于零的数,这个值就是扩展提示符中的转义字符 w 和 w时要保留的目录节点数目。删除的字符用省略号来代替。
PS3 这个变量的值用作内部命令 select 的提示符。如果没有设置这个变量,select 命令就把"#?"作为提示符。
PS4 它的值用作回显命令时的提示符;可以用内部命令 set 的"-x"选项打开命令回显。这个变量的第一个字符在必要时将被重复显示以表示多层间接变量。默认值是"+ "。
PWD 内部命令 cd 所设置的当前工作目录。
RANDOM 每次使用这个变量都会随机生成一个 0 到 32767 之间的整数。对这个变量赋值就会给随机数发生器赋于不同的种子。
REPLY 内部命令 read 的默认变量。
SECONDS 这个变量扩展为 shell 从启动到现在经过的秒数。对这个变量赋值就会把这个时间计数器设为赋与的值,而这个变量的扩展值就成为赋与的值加上赋值后所经过的秒数。
SHELL 这个环境变量保存 shell 的完整路径。如果 shell 启动时没有设置它,Bash 就把当前用户的登录shell 的完整路径赋给它。
SHELLOPTS 冒号分隔的所有启用的 shell 选项;其中的每个单词都是内部命令 set 的"-o"选项的参数。这些选项是 set -o 命令显示为"on"的条目。
如果启动 Bash 时环境中有这个变量,则 shell 会在读取初始化文件之前打开其中的每个选项。这个变量是只读的。
SHLVL 每次启动一个新的 Bash 时这个变量都增加一。它是为计算 shell 的嵌套层次而设的。
TIMEFORMAT 这个变量的值用作格式化字符串上,它决定带有 time 关键字的管道怎么显示时间信息。
"%"引导一个转义序列,可以扩展为时间值或其它信息。转义序列的含义如下;其中的方括号表示可选的部分。
%% 表示"%"本身。
%[p][l]R 已经经历的时间,以秒为单位。
%[p][l]U 用户模式下所使用的 CPU 时间,以秒为单位。
%[p][l]S 系统模式下所使用的 CPU 时间,以秒为单位。
%P CPU 使用百分比,即(%U + %S)/%R。
其中:可选的 p 是一个指定显示精度的数字,即小数点后的小数位数。0 表示不显示小数点和后面的小数。最多只能指定显示三位;比 3 大的数值将被改为 3。如果没有指定 p,则使用 3。
可选的 l 指定使用长格式 MM mSS.FFs,其中包括分钟。p 的值决定是否包括小数部分。
如果这个变量没有设置,Bash 就把它当成$'
real %3lR
user %3lU
sys %3lS'
如果这个值为空,则不显示时间信息。在显示格式化后的信息时,会自动在末尾加上一个换行符。
TMOUT 如果设为一个大于零的值,它就是内部命令 read 默认的超时时间。
如果输入是来自终端并且在 TMOUT 秒内没有输入,则select 命令也会结束。
在交互式的 shell 中,这个值表示打印提示符以后等待输入时的秒数;如果在这段时间内没有输入,Bash 就会退出。
TMPDIR 如果设置了,Bash 就用它的值作为目录名,并根据 shell 需要在这个目录中创建临时文件。
UID 当前用户的实际用户号。这个变量是只读的。