diff --git a/command/export.md b/command/export.md index c52b96cf54..09481b1d55 100644 --- a/command/export.md +++ b/command/export.md @@ -1,31 +1,173 @@ -export -=== +## export -设置或显示系统环境变量 +为shell变量或函数设置导出属性。 -## 补充说明 +### 概要 -**export命令** 用于将shell变量输出为环境变量,或者将shell函数输出为环境变量。 +export [-fn] [name[=word]]... -一个变量创建时,它不会自动地为在它之后创建的shell进程所知。而命令export可以向后面的shell传递变量的值。当一个shell脚本调用并执 行时,它不会自动得到原为脚本(调用者)里定义的变量的访问权,除非这些变量已经被显式地设置为可用。export命令可以用于传递一个或多个变量的值到任何后继脚本。 +export -p -### 语法 +### 主要用途 +- 新建一到多个变量并设置导出属性。 + +- 修改一到多个拥有导出属性的变量的值。 + +- 删除一到多个变量的导出属性。 + +- 显示全部拥有导出属性的变量。 + +- 为一到多个已定义函数新增导出属性。 + +- 删除一到多个函数的导出属性。 + +- 显示全部拥有导出属性的函数。 + + +#### 选项 + +-p:显示全部拥有导出属性的变量。 + +-pf:显示全部拥有导出属性的函数。 + +-n:删除变量的导出属性。 + +-nf:删除变量的导出属性。 + +-f:指向函数。 + +--:在它之后的选项无效。 + + +#### 参数 + +name(可选):变量名或已定义函数名。 + +value(可选):变量的值。 + + + +#### 返回值 + +export返回true除非你提供了非法选项或非法名称。 + +### 例子 + +常见用法 ```shell -export(选项)(参数) +# 显示全部拥有导出属性的变量。 +# export -p +# export +# 显示全部拥有导出属性的函数。 +# export -pf ``` -### 选项 ```shell --f:代表[变量名称]中为函数名称; --n:删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中; --p:列出所有的shell赋予程序的环境变量。 +#首先删除要演示的变量名 +#unset a b +#新建变量的同时增加导出属性 +export a b=3 +#当然也可以这样 +b=3 +export b + +#修改拥有导出属性的变量的值 +export a=5 b=7 +#当然也可以直接赋值修改 +a=5;b=7 + +#删除变量的导出属性 +export -n a b ``` -### 参数 -变量:指定要输出或者删除的环境变量。 +``` +#首先删除要演示的函数名 +unset func_1 func_2 +#创建函数 +function func_1(){ echo '123'; } +function func_2(){ echo '890'; } + +#为已定义函数增加导出属性 +export -f func_1 func_2 + +#删除函数的导出属性 +export -fn a b +``` + +### 错误用法 + +- 对未定义的函数添加导出属性。 + +- 对没有导出属性的函数/变量执行删除导出属性操作。 + +- 在`--`后使用选项。 + + +### Q&A + +Q:对变量或函数设置导出属性有什么用? + +A:它们会成为环境变量,可以在脚本中访问它们,尤其是脚本中调用的子进程需要时。( **参考链接4** ) + + +Q:如果我编写的脚本修改了已有的环境变量的值,那么执行它会在当前终端生效吗?会影响之前以及之后打开的终端吗? + +A:只有通过`source`方式调用的脚本会生效,您可以查看`source`命令获得更多信息;其他方式只是在子shell中执行。 +之前的不会影响,之后的除非是修改了`~/.bashrc`这种启动终端时加载的脚本。( **参考链接1** ) + + +Q:我脚本文件中调用`~/.bashrc`中定义的函数和变量。为什么在新打开的终端中通过 `sh` 方式调用该脚本或直接运行 +这个当前用户有执行权限的脚本却不能使用这些函数和变量? + +A:请在`~/.bashrc`文件中增加export它们的语句。另请参阅 **知识点** 段落。 + + +Q:列表和关联数组也可以设置导出属性吗? + +A:是可以的(如果你的bash支持它们),不过有些问题( **参考链接2** )。 + + +Q:为什么我在查看变量或函数导出属性的时候显示的开头是`declare`? + +A:因为`declare`也能够设置变量或函数的导出属性,详见`declare`命令。 + + +### 注意 + +1. 该命令是bash内建命令,相关的帮助信息请查看`help`命令。 + +### 知识点 + +在 `info bash`或 [bash在线文档](http://www.gnu.org/software/bash/manual/bash.html) 的 + `3.7.3`节提到了shell执行环境,其中涉及变量和函数的内容如下 + +> - shell parameters that are set by variable assignment or with set or inherited from the shell’s parent in the environment +> - shell functions defined during execution or inherited from the shell’s parent in the environment + +那么第一句话中的参数又和变量有什么关系呢?在`3.4`节第一段中提到: + +> A variable is a parameter denoted by a name. + +变量是有名字的参数。 + +那么子shell确实继承了父shell中带有导出属性的变量或函数。 + +可参考链接 [执行脚本方式的区别](https://blog.csdn.net/soaringlee_fighting/article/details/78759448) + + +### 参考链接 + +1. [关于bashrc profile文件的讨论](https://www.cnblogs.com/hongzg1982/articles/2101792.html) + + +2. [关于export数组的讨论](https://stackoverflow.com/questions/5564418/exporting-an-array-in-bash-script) + +3. [export -pf用法](https://unix.stackexchange.com/questions/22796/can-i-export-functions-in-bash) + +4. [环境变量和shell变量的区别](https://askubuntu.com/questions/26318/environment-variable-vs-shell-variable-whats-the-difference) ### 实例 @@ -56,4 +198,4 @@ declare -x USER="root" ``` - \ No newline at end of file +