Bash中的那些有趣的内置变量
Bash中定义了大量的内置变量,有些变量颇为有趣,摘录如下:
BASH自身信息
BASH / SHELL
BASH 和 SHELL 变量记录的是当前shell的路径,linux上通常这两个变量的值都是/bin/bash.
这两者的区别在于,不是所有的shell都有定义 BASH
变量,但一定有定义 SHELL
变量。
另外,当在一个shell中启动另一个shell的时候, SHELL
变量的值不会发生改变,而 BASH
变量的值会发生改变,指向新shell的路径。如下所示:
sh-4.4$ echo $SHELL /bin/bash sh-4.4$ echo $BASH /usr/bin/sh sh-4.4$
BASH_VERSINFO
该变量定义了一个6元素的数组,用于表示当前bash的版本信息,这六个元素的意义分别为:
- BASH_VERSINFO[0]
- 主版本号
- BASH_VERSINFO[1]
- 次版本号
- BASH_VERSINFO[2]
- 补丁版本
- BASH_VERSINFO[3]
- 编译版本
- BASH_VERSINFO[4]
- 发行状态
- BASH_VERSINFO[5]
- 硬件架构。
BASHPID
当前bash进程的进程号
BASH_ARGC
该数组变量存储的是每个bash调用栈中传递给bash的参数数量。该变量只有在bash开启extdebug选项的情况下才会设置
BASH_ARGV
该数组变量存储的是每个bash调用栈中传递给bash的参数列表。该变量只有在bash开启extdebug选项的情况下才会设置
BASH_COMMAND
当前正在(或马上要)执行的命令
BASH_EXECUTION_STRING
bash -c
选项的参数
FUNCNAME
当前正在执行函数的名称,常用于调试
BASH_SOURCE
FUNCNAME 所定义的源文件,其中 ${FUNCNAME[$i]} 定义在 ${BASH_SOURCE[$i]} 文件中
LINENO
脚本或函数中的当前行号,常用于调试
PPID
shell父进程进程号
SECONDS
脚本从运行以来经过的时间(单位为秒)。可用于调试性能。
start=$SECONDS sleep 2 pass=$(($SECONDS - $start)) echo "$pass seconds passed"
2 seconds passed
SHELLOPTS
冒号分隔的处于开状态的shell选项列表。该变量只能通过 set -o(打开选项)
/ set +o(关闭选项)
来设置。
SHLVL
Shell嵌套的层次,第一个shell的$SHLVL为1,每启动一个bash实例就会+1
COLUMNS
终端的宽度
LINES
终端的高度
EMACS
判断bash是否在EMACS中执行,这种情况下bash会禁用行编辑功能
用户信息
EUID
当前用户的有效用户ID,它在shell启动时被设置,之后无法再被修改。
GROUPS
当前用户所属组ID的列表
UID
当前用户ID
USER
当前用名
HOME
用户的个人目录地址
主机信息
HOSTNAME
当前主机名
HOSTTYPE
当前主机类型
OSTYPE
操作系统类型
MACHTYPE
包含了主机类型和操作系统类型
显示相关
PS1 / PS2 / PS3 / PS4 / PROMPT_DIRTRIM
定义提示符
TIMEFORMAT
指定显示时间信息的格式
影响bash行为的参数
BASH_ENV
该值为shell初始化文件的路径,若设置了该值则会执行该值所指定文件内的初始化命令
CDPATH cd命令的搜索路径,是一个用冒号分隔的目录列表。shell在执行cd命令时会从这些指定的目录列表中寻找要进入的目标路径。
FCEDIT
内建命令fc默认的编辑器
FIGNORE
由冒号分隔的后缀名列表,在进行文件名补全时会忽略以这些后缀名结尾的文件名
GLOBIGNORE
它是由冒号分隔的模式列表,表示通配时忽略的文件名集合。
IFS
内部字段分隔符,影响read命令如何将行进行分成词
OSIXLY_CORRECT
设定让bash进入posix mode
TMOUT
用于设置Shell的过期时间,TMOUT不为0时,shell会在TMOUT秒后将自动退出.
同时TMOUT也用于作为read命令的默认超时时间。
EXECIGNORE
它是由冒号分隔的模式列表,表示在$PATH中搜索命令时忽略的文件名集合。
TMPDIR
若设置了,则bash在该值所指定的目录下创建临时文件
其他
BASH_REMATCH
当使用 =~ 进行正则匹配时,该数组变量存储的是整体或个分组匹配的字符串位置,其中
- ${BASH_REMATCH[0]}
- 整个正则表达式匹配的位置
- n
- 第n个分组匹配的位置
OLDPWD
上一次cd的工作目录
PWD
当前工作目录
RANDOM
产生一个0-32767之间的随机整数
REPLY
read命令默认将标准输入存入该变量,select命令也默认将选择的序号存入该变量。
PROMPT_COMMAND
该变量是一个命令,每次现实主提示符之前都会执行该命令。
DIRSTACK
存放但前目录栈的数组,pushd和popd两个内建命令需要操作该数组,同时也允许手工对该数组内的变量进行赋值从而影响 pushd和popd的行为。
另外,该参数的值可以通过 dirs
命令来显示
COMP_CWORD / COMP_LINE / COMP_POINT / COMP_WORDS / COMPREPLY / HOSTFILE
用于为bash自定义补全时使用
HISTCONTROL / HISTFILE / HISTFILESIZE / HISTIGNORE / HISTSIZE
配置history命令的行为
MAIL / MAILCHECK / MAILPATH
影响邮件提醒行为