#+TITLE: Bash中的那些有趣的内置变量 #+AUTHOR: lujun9972 #+TAGS: linux和它的小伙伴 #+DATE: [2018-11-29 四 17:58] #+LANGUAGE: zh-CN #+OPTIONS: H:6 num:nil toc:t \n:nil ::t |:t ^:nil -:nil f:t *:t <:nil Bash中定义了大量的内置变量,有些变量颇为有趣,摘录如下: * BASH自身信息 ** BASH / SHELL BASH 和 SHELL 变量记录的是当前shell的路径,linux上通常这两个变量的值都是/bin/bash. 这两者的区别在于,不是所有的shell都有定义 =BASH= 变量,但一定有定义 =SHELL= 变量。 另外,当在一个shell中启动另一个shell的时候, =SHELL= 变量的值不会发生改变,而 =BASH= 变量的值会发生改变,指向新shell的路径。如下所示: #+BEGIN_EXAMPLE sh-4.4$ echo $SHELL /bin/bash sh-4.4$ echo $BASH /usr/bin/sh sh-4.4$ #+END_EXAMPLE ** 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 脚本从运行以来经过的时间(单位为秒)。可用于调试性能。 #+BEGIN_SRC shell :results org start=$SECONDS sleep 2 pass=$(($SECONDS - $start)) echo "$pass seconds passed" #+END_SRC #+BEGIN_SRC org 2 seconds passed #+END_SRC ** 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 影响邮件提醒行为