【linux命令讲解大全】198.Shell命令解析:export和exportfs的用途和参数解释

2024-03-02 14:41:44 浏览数 (2)

export

为shell变量或函数设置导出属性。

概要

代码语言:javascript复制
export [-fn] [name[=word]]...
export -p

主要用途

  • 定义一到多个变量并设置导出属性。
  • 修改一到多个变量的值并设置导出属性。
  • 删除一到多个变量的导出属性。
  • 显示全部拥有导出属性的变量。
  • 为一到多个已定义函数新增导出属性。
  • 删除一到多个函数的导出属性。
  • 显示全部拥有导出属性的函数。

选项

  • -f:指向函数。
  • -n:删除变量的导出属性。
  • -p:显示全部拥有导出属性的变量。
  • -pf:显示全部拥有导出属性的函数。
  • -nf:删除函数的导出属性。
  • --:在它之后的选项无效。

参数

  • name(可选):变量名或已定义函数名。
  • value(可选):变量的值。

返回值

export返回true除非你提供了非法选项或非法名称。

例子

代码语言:javascript复制
# 显示全部拥有导出属性的变量。
# export -p
# export
# 显示全部拥有导出属性的函数。
# export -pf
# 首先删除要演示的变量名
# 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
# 添加环境变量(JAVA)到`~/.bashrc`
PATH=/usr/local/jdk1.7.0/bin:$PATH
# 添加当前位置到动态库环境变量
export LD_LIBRARY_PATH=$(pwd):${LD_LIBRARY_PATH}

错误用法

  • 对未定义的函数添加导出属性。
  • 对没有导出属性的函数/变量执行删除导出属性操作。
  • -- 后使用选项。

Q&A

Q:对变量或函数设置导出属性有什么用? A:它们会成为环境变量,可以在脚本中访问它们,尤其是脚本中调用的子进程需要时。

Q:如果我编写的脚本修改了已有的环境变量的值,那么执行它会在当前终端生效吗?会影响之前以及之后打开的终端吗? A:只有通过 source 方式调用的脚本会生效,您可以查看 source 命令获得更多信息;其他方式只是在子shell中执行。之前的不会影响,之后的除非是修改了 ~/.bashrc 这种启动终端时加载的脚本。

Q:我脚本文件中调用 ~/.bashrc 中定义的函数和变量。为什么在新打开的终端中通过 sh 方式调用该脚本或直接运行这个当前用户有执行权限的脚本却不能使用这些函数和变量? A:请在 ~/.bashrc 文件中增加 export 它们的语句。

Q:数组和关联数组也可以设置导出属性吗? A:是可以的(如果你的bash支持它们),不过有些问题。

Q:为什么我在查看变量或函数导出属性的时候显示的开头是 declare? A:因为 declare 也能够设置变量或函数的导出属性,详见 declare 命令。

注意 该命令是bash内建命令,相关的帮助信息请查看 help 命令。

知识点 在 info bashbash 在线文档的 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中带有导出属性的变量或函数。

可参考链接:执行脚本方式的区别

参考链接

  • 关于bashrc profile文件的讨论
  • 关于export数组的讨论
  • export -pf用法
  • 环境变量和shell变量的区别

扩展阅读 一般来说,配置交叉编译工具链的时候需要指定编译工具的路径,此时就需要设置环境变量。查看已经存在的环境变量:

代码语言:javascript复制
[root@localhost ~]# export
declare -x G_BROKEN_FILENAMES="1"
declare -x HISTSIZE="1000"
declare -x HOME="/root"
declare -x hostname="localhost"
declare -x INPUTRC="/etc/inputrc"
... (省略部分内容) ...
declare -x USER="root" 

exportfs

管理NFS共享文件系统列表

补充说明 exportfs 命令用来管理当前NFS共享的文件系统列表。

参数:

  • -a 打开或取消所有目录共享。
  • -o options,... 指定一列共享选项,与 exports(5) 中讲到的类似。
  • -i 忽略 /etc/exports 文件,从而只使用默认的和命令行指定的选项。
  • -r 重新共享所有目录。它使 /var/lib/nfs/xtab/etc/exports 同步。 它将 /etc/exports 中已删除的条目从 /var/lib/nfs/xtab 中删除,将内核共享表中任何不再有效的条目移除。
  • -u 取消一个或多个目录的共享。
  • -f 在“新”模式下,刷新内核共享表之外的任何东西。 任何活动的客户程序将在它们的下次请求中得到 mountd 添加的新的共享条目。
  • -v 输出详细信息。当共享或者取消共享时,显示在做什么。 显示当前共享列表的时候,同时显示共享的选项。

0 人点赞