1 | export
|
2 | ===
|
3 |
|
4 | 为shell变量或函数设置导出属性。
|
5 |
|
6 | ## 概要
|
7 |
|
8 | ```
|
9 | export [-fn] [name[=word]]...
|
10 | export -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 |
|
36 | name(可选):变量名或已定义函数名。
|
37 |
|
38 | value(可选):变量的值。
|
39 |
|
40 | ### 返回值
|
41 |
|
42 | export返回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 | # 定义变量的同时增加导出属性
|
58 | export a b=3
|
59 | # 当然也可以先定义后增加导出属性
|
60 | b=3
|
61 | export b
|
62 |
|
63 | # 修改拥有导出属性的变量的值
|
64 | export a=5 b=7
|
65 | # 当然也可以直接赋值修改
|
66 | a=5;b=7
|
67 |
|
68 | # 删除变量的导出属性
|
69 | export -n a b
|
70 | ```
|
71 |
|
72 |
|
73 | ```shell
|
74 | # 首先删除要演示的函数名
|
75 | unset func_1 func_2
|
76 | # 创建函数
|
77 | function func_1(){ echo '123'; }
|
78 | function func_2(){ echo '890'; }
|
79 |
|
80 | # 为已定义函数增加导出属性
|
81 | export -f func_1 func_2
|
82 |
|
83 | # 删除函数的导出属性
|
84 | export -fn a b
|
85 | ```
|
86 |
|
87 | ```shell
|
88 | # 添加环境变量(JAVA)到`~/.bashrc`
|
89 | PATH=/usr/local/jdk1.7.0/bin:$PATH
|
90 | # 添加当前位置到动态库环境变量
|
91 | export LD_LIBRARY_PATH=$(pwd):${LD_LIBRARY_PATH}
|
92 | ```
|
93 |
|
94 | ## 错误用法
|
95 |
|
96 | - 对未定义的函数添加导出属性。
|
97 | - 对没有导出属性的函数/变量执行删除导出属性操作。
|
98 | - 在 `--` 后使用选项。
|
99 |
|
100 | ## Q&A
|
101 |
|
102 | #### Q:对变量或函数设置导出属性有什么用?
|
103 |
|
104 | A:它们会成为环境变量,可以在脚本中访问它们,尤其是脚本中调用的子进程需要时。( **[参考链接4][4]** )
|
105 |
|
106 | #### Q:如果我编写的脚本修改了已有的环境变量的值,那么执行它会在当前终端生效吗?会影响之前以及之后打开的终端吗?
|
107 |
|
108 | A:只有通过`source`方式调用的脚本会生效,您可以查看`source`命令获得更多信息;其他方式只是在子shell中执行。
|
109 | 之前的不会影响,之后的除非是修改了`~/.bashrc`这种启动终端时加载的脚本。( **[参考链接1][1]** )
|
110 |
|
111 | #### Q:我脚本文件中调用`~/.bashrc`中定义的函数和变量。为什么在新打开的终端中通过 `sh` 方式调用该脚本或直接运行
|
112 |
|
113 | 这个当前用户有执行权限的脚本却不能使用这些函数和变量?
|
114 | A:请在`~/.bashrc`文件中增加export它们的语句。另请参阅 **知识点** 段落。
|
115 |
|
116 | #### Q:数组和关联数组也可以设置导出属性吗?
|
117 |
|
118 | A:是可以的(如果你的bash支持它们),不过有些问题( **[参考链接2][2]** )。
|
119 |
|
120 | #### Q:为什么我在查看变量或函数导出属性的时候显示的开头是`declare`?
|
121 |
|
122 | A:因为`declare`也能够设置变量或函数的导出属性,详见`declare`命令。
|
123 |
|
124 | ### 注意
|
125 |
|
126 | 1. 该命令是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 |
|
149 | 1. [关于bashrc profile文件的讨论][1]
|
150 | 2. [关于export数组的讨论][2]
|
151 | 3. [export -pf用法][3]
|
152 | 4. [环境变量和shell变量的区别][4]
|
153 |
|
154 | ### 扩展阅读
|
155 |
|
156 | 一般来说,配置交叉编译工具链的时候需要指定编译工具的路径,此时就需要设置环境变量。查看已经存在的环境变量:
|
157 |
|
158 | ```shell
|
159 | [root@localhost ~]# export
|
160 | declare -x G_BROKEN_FILENAMES="1"
|
161 | declare -x HISTSIZE="1000"
|
162 | declare -x HOME="/root"
|
163 | declare -x hostname="localhost"
|
164 | declare -x INPUTRC="/etc/inputrc"
|
165 | declare -x LANG="zh_CN.UTF-8"
|
166 | declare -x LESSOPEN="|/usr/bin/lesspipe.sh %s"
|
167 | declare -x logname="root"
|
168 | declare -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:"
|
169 | declare -x mail="/var/spool/mail/root"
|
170 | declare -x OLDPWD
|
171 | declare -x PATH="/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"
|
172 | declare -x pwd="/root"
|
173 | declare -x SHELL="/bin/bash"
|
174 | declare -x SHLVL="1"
|
175 | declare -x SSH_CLIENT="192.168.2.111 2705 22"
|
176 | declare -x SSH_CONNECTION="192.168.2.111 2705 192.168.2.2 22"
|
177 | declare -x SSH_TTY="/dev/pts/0"
|
178 | declare -x TERM="linux"
|
179 | declare -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 |
|