从函数内部导出变量是否等于该变量的全局导出?

use*_*970 17 bash shell-script environment-variables function subshell

我使用带有本机 Bash 的 Ubuntu 16.04。

我不确定是否执行

#!/bin/bash
myFunc() {
    export myVar="myVal"
}
myFunc
Run Code Online (Sandbox Code Playgroud)

在任何意义上都等于,只是执行export myVar="myVal".

当然,全局变量通常应该在函数之外声明(我认为这是约定俗成的问题,即使技术上可行)但我确实想知道更奇特的情况,即编写一些非常通用的函数并希望在其中添加一个变量仍然可以在任何地方使用。

export一个函数中的变量,等同于全球出口了,直接在命令行,使其可用于一切都在外壳(所有子shell,以及功能在其内部)?

Kus*_*nda 21

您的脚本会在脚本的环境中创建一个环境变量myVar。该脚本目前呈现的功能完全等同于

#!/bin/bash

export myVar="myVal"
Run Code Online (Sandbox Code Playgroud)

export在函数体中发生的事实与环境变量的范围无关(在这种情况下)。一旦函数被调用,它就会开始存在。

该变量将在脚本环境和函数调用后从脚本启动的任何其他进程的环境中可用。

该变量将不存在于父进程的环境(您运行脚本的交互式 shell)中,除非脚本来源(使用.source),在这种情况下,整个脚本将在交互式 shell 的环境中执行(这是“采购”shell 文件的目的)。

没有函数调用本身:

myFunc() {
    export myVar="myVal"
}
Run Code Online (Sandbox Code Playgroud)

采购文件将放置myFunc在调用 shell 的环境中。然后调用该函数将创建环境变量。

另请参阅问题shell 变量可以具有哪些范围?

  • 有关 [subshel​​ls](https://tldp.org/LDP/abs/html/subshel​​ls.html) 的注意事项 - 如果在 _( subshel​​l )_ 内调用带有 `export myvar` 的函数,则该变量仍将是在父作用域中不可用。 (2认同)
  • @UserRebo 啊,现在我明白了!您需要在“set -x”和“export”之间添加“;”(或换行符)。它们是两个独立的命令。您最初编写的内容“set -x export var=value”会将“$1”设置为字符串“export”,将“$2”设置为字符串“variable=value”。我没有发现丢失的“;”,因为这是一个很奇怪的命令。 (2认同)

Noa*_*nos 7

如果使用导出变量的函数,请确保不要在子 shell 中调用它,例如

( export_var_func )  # Variable will NOT be exported outside
Run Code Online (Sandbox Code Playgroud)

如果通过管道传输函数也会发生这种情况,因为管道使用子外壳。

例如管道进入三通:

export_var_func | tee my.log # Variable will NOT be exported outside
Run Code Online (Sandbox Code Playgroud)

要避免使用管道子 shell,请改用重定向:

export_var_func > >(tee func.log) # Variable WILL be exported outside
Run Code Online (Sandbox Code Playgroud)