暗无天日

=============>DarkSun的个人博客

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

影响邮件提醒行为