查看所有函数
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
输出不存在函数;