UNPKG

6.15 kBMarkdownView Raw
1export
2===
3
4为shell变量或函数设置导出属性。
5
6## 概要
7
8```
9export [-fn] [name[=word]]...
10export -p
11```
12
13## 主要用途
14
15- 定义一到多个变量并设置导出属性。
16- 修改一到多个变量的值并设置导出属性。
17- 删除一到多个变量的导出属性。
18- 显示全部拥有导出属性的变量。
19- 为一到多个已定义函数新增导出属性。
20- 删除一到多个函数的导出属性。
21- 显示全部拥有导出属性的函数。
22
23## 选项
24
25```shell
26-f:指向函数。
27-n:删除变量的导出属性。
28-p:显示全部拥有导出属性的变量。
29-pf:显示全部拥有导出属性的函数。
30-nf:删除函数的导出属性。
31--:在它之后的选项无效。
32```
33
34## 参数
35
36name(可选):变量名或已定义函数名。
37
38value(可选):变量的值。
39
40### 返回值
41
42export返回true除非你提供了非法选项或非法名称。
43
44## 例子
45
46```shell
47# 显示全部拥有导出属性的变量。
48# export -p
49# export
50# 显示全部拥有导出属性的函数。
51# export -pf
52```
53
54```shell
55# 首先删除要演示的变量名
56#unset a b
57# 定义变量的同时增加导出属性
58export a b=3
59# 当然也可以先定义后增加导出属性
60b=3
61export b
62
63# 修改拥有导出属性的变量的值
64export a=5 b=7
65# 当然也可以直接赋值修改
66a=5;b=7
67
68# 删除变量的导出属性
69export -n a b
70```
71
72
73```shell
74# 首先删除要演示的函数名
75unset func_1 func_2
76# 创建函数
77function func_1(){ echo '123'; }
78function func_2(){ echo '890'; }
79
80# 为已定义函数增加导出属性
81export -f func_1 func_2
82
83# 删除函数的导出属性
84export -fn a b
85```
86
87```shell
88# 添加环境变量(JAVA)到`~/.bashrc`
89PATH=/usr/local/jdk1.7.0/bin:$PATH
90# 添加当前位置到动态库环境变量
91export LD_LIBRARY_PATH=$(pwd):${LD_LIBRARY_PATH}
92```
93
94## 错误用法
95
96- 对未定义的函数添加导出属性。
97- 对没有导出属性的函数/变量执行删除导出属性操作。
98- `--` 后使用选项。
99
100## Q&A
101
102#### Q:对变量或函数设置导出属性有什么用?
103
104A:它们会成为环境变量,可以在脚本中访问它们,尤其是脚本中调用的子进程需要时。( **[参考链接4][4]**
105
106#### Q:如果我编写的脚本修改了已有的环境变量的值,那么执行它会在当前终端生效吗?会影响之前以及之后打开的终端吗?
107
108A:只有通过`source`方式调用的脚本会生效,您可以查看`source`命令获得更多信息;其他方式只是在子shell中执行。
109之前的不会影响,之后的除非是修改了`~/.bashrc`这种启动终端时加载的脚本。( **[参考链接1][1]**
110
111#### Q:我脚本文件中调用`~/.bashrc`中定义的函数和变量。为什么在新打开的终端中通过 `sh` 方式调用该脚本或直接运行
112
113这个当前用户有执行权限的脚本却不能使用这些函数和变量?
114A:请在`~/.bashrc`文件中增加export它们的语句。另请参阅 **知识点** 段落。
115
116#### Q:数组和关联数组也可以设置导出属性吗?
117
118A:是可以的(如果你的bash支持它们),不过有些问题( **[参考链接2][2]** )。
119
120#### Q:为什么我在查看变量或函数导出属性的时候显示的开头是`declare`?
121
122A:因为`declare`也能够设置变量或函数的导出属性,详见`declare`命令。
123
124### 注意
125
1261. 该命令是bash内建命令,相关的帮助信息请查看`help`命令。
127
128### 知识点
129
130`info bash`或 [bash在线文档](http://www.gnu.org/software/bash/manual/bash.html) 的
131 `3.7.3`节提到了shell执行环境,其中涉及变量和函数的内容如下
132
133> - shell parameters that are set by variable assignment or with set or inherited from the shell’s parent in the environment
134> - shell functions defined during execution or inherited from the shell’s parent in the environment
135
136那么第一句话中的参数又和变量有什么关系呢?在`3.4`节第一段中提到:
137
138> A variable is a parameter denoted by a name.
139
140变量是有名字的参数。
141
142那么子shell确实继承了父shell中带有导出属性的变量或函数。
143
144可参考链接: [执行脚本方式的区别](https://blog.csdn.net/soaringlee_fighting/article/details/78759448)
145
146
147### 参考链接
148
1491. [关于bashrc profile文件的讨论][1]
1502. [关于export数组的讨论][2]
1513. [export -pf用法][3]
1524. [环境变量和shell变量的区别][4]
153
154### 扩展阅读
155
156一般来说,配置交叉编译工具链的时候需要指定编译工具的路径,此时就需要设置环境变量。查看已经存在的环境变量:
157
158```shell
159[root@localhost ~]# export
160declare -x G_BROKEN_FILENAMES="1"
161declare -x HISTSIZE="1000"
162declare -x HOME="/root"
163declare -x hostname="localhost"
164declare -x INPUTRC="/etc/inputrc"
165declare -x LANG="zh_CN.UTF-8"
166declare -x LESSOPEN="|/usr/bin/lesspipe.sh %s"
167declare -x logname="root"
168declare -x LS_COLORS="no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:"
169declare -x mail="/var/spool/mail/root"
170declare -x OLDPWD
171declare -x PATH="/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"
172declare -x pwd="/root"
173declare -x SHELL="/bin/bash"
174declare -x SHLVL="1"
175declare -x SSH_CLIENT="192.168.2.111 2705 22"
176declare -x SSH_CONNECTION="192.168.2.111 2705 192.168.2.2 22"
177declare -x SSH_TTY="/dev/pts/0"
178declare -x TERM="linux"
179declare -x USER="root"
180```
181
182[1]: https://www.cnblogs.com/hongzg1982/articles/2101792.html
183[2]: https://stackoverflow.com/questions/5564418/exporting-an-array-in-bash-script
184[3]: https://unix.stackexchange.com/questions/22796/can-i-export-functions-in-bash
185[4]: https://askubuntu.com/questions/26318/environment-variable-vs-shell-variable-whats-the-difference
186
187