bash 查看变量函数定义和值 (type declare)
查看所有函数
compgen -A function
查看函数定义
type -a function_name
declare -f function_name
查看函数对应文件
shopt -s extdebug; declare -F function_name
指令解析
type [-afptP] [name ...]
功能: 对于给定的name, 输出其被当作指令输入时会被解析成什么; 比如set是内置;ls是别名;vim是文件指令;ch@ch:~/ch$ type -t ls quote set vim if alias function builtin file keyword
-t: 仅仅输出类型; 没有name提供则不输出, 返回值也是错误;
-p:name类型是file类型, 则会输出对应文件位置; 类似which;
-a: 输出所有name指令对应所有信息;所有存在位置,alias和function也会输出,function输出定义内容; 即可能有多份; 比如type -a ls会输出alias和文件;
-f: 不会搜索function类型;其他的都会搜索alias builtin file keyword;指令格式:
declare [-aAfFgiIlnrtux] [-p] [name[=value] ...]
基本介绍: 声明变量并添加属性(类型array,maps;作用域之类); 如果没有name参数, 则输出所有变量的值;
-p: 属性和值(一般是变量); 一般只和-f -F使用; 其他属性忽略; 无name则输出所有的变量的属性和值; 属性一般是由其他选项参数提供;-f则限制为函数;
-F: 输出函数定义的文件位置; 函数名和属性会输出; 但是一般需要开shopt -s extdebug, 开了之后才会输出源代码位置和行号;
-g: 定义全局的变量或修改全局变量; 即使是在函数中调用;
-I: 继承外部同名函数属性(nameref属性除外); 如果没有同名, 本地变量;
下面的属性是限制输出变量类型或添加变量属性; 即限制属性或添加属性;
-a: 数组类型变量;
-A:map类型变量;
-f: 函数类型;
-i: 可以被当成整形的变量;即由数字组成的变量; 定义则表达式被当成算数表达式解析;
-l: 值都被转成小写; 不用于属性;
-n:nameref属性; 类似C++ &,别名;declare -n dd=PATH,PATH和dd同名,PATH变dd变, 反之亦然; 不用于数组类型;
-r: 变量只读; 不允许被修改或unset;
-t:trace属性; 函数则会继承DEBUG,RETURN的trap; 普通变量无意义;
-u: 值都被转成大写; 不用于属性;
-x: 定义export变量, 作用域为后续执行的指令;
-+optioin:+关闭;-打开;+a +A无用, 不会改变数组和map类型;+r也不会删除只读属性;
declare声明的变量默认local,-g则是global;name=value则是变量赋值,定义;
-a -A或表达式生成的数组,map类型在定义的时候属性不会体现; 比如-r; 只有后续复制修改的时候才会体现;-r属性会在赋值修改的时候触发, 而不是定义;
返回值: 非法选项;-f foo=bar错误定义; 修改只读变量; 错误操作数组;name命名非法; 关闭只读属性; 关闭数组属性;-f输出不存在函数;
