来源和出口有什么区别?
- 2024-10-25 08:42:00
- admin 原创
- 68
问题描述:
我正在编写一个 shell 脚本,用于读取具有 key=value 对的文件并将这些变量设置为环境变量。但我有一个疑问,如果我这样做,source file.txt
是否会将该文件中定义的变量设置为环境变量,或者我应该逐行读取文件并使用 export 命令进行设置?
在这种情况下,源命令与导出命令不同吗?
解决方案 1:
当您打开source
文件时,将设置赋值,但不会导出变量,除非allexport
已设置选项。如果您希望导出所有变量,则使用文件比读取文件并明确使用allexport
要简单得多。换句话说,您应该这样做:source
`export`
set -a
. file.txt
(我更喜欢,.
因为它比 更便携source
,但source
在 中运行良好bash
。)
请注意,导出变量并不会使其成为环境变量。它只是使其成为任何子 shell 中的环境变量。
解决方案 2:
source
( .
) vs export
(以及flock
末尾的一些文件锁 [ ] 内容)
简而言之
source some_script.sh
或与 POSIX 兼容的等效项 ,. some_script.sh
从其他脚本引入变量,而export my_var="something"
将变量推送到从当前脚本/进程调用/启动的其他脚本/进程。
在 Linux shell 脚本中使用source some_script.sh
或. some_script.sh
有点像import some_module
在 Python、#include <some_header_file.h>
C 或 C++ 中使用。它从正在使用的脚本中引入变量。
使用export some_var="something"
有点像在本地设置该变量,因此它可用于当前脚本或进程的其余部分,然后将其传递给从此时起可能调用的任何和所有子脚本或进程。
更多详细信息
因此,这是:
# export `some_var` so that it is set and available in the current
# script/process, as well as in all sub-scripts or processes which are called
# from the current script/process
export some_var="something"
# call other scripts/processes, passing in `some_var` to them automatically
# since it was just exported above!
script1.sh # this script now gets direct access to `some_var`
script2.sh # as does this one
script3.sh # and this one
就像你做了这件事一样:
# set this variable for the current script/process only
some_var="something"
# call other scripts/processes, passing in `some_var` to them **manually**
# so they can use it too
some_var="something" script1.sh # manually pass in `some_var` to this script
some_var="something" script2.sh # manually pass in `some_var` to this script
some_var="something" script3.sh # manually pass in `some_var` to this script
除了上面的第一个版本,我们调用的地方export some_var="something"
实际上有一个递归传递或导出变量到子进程,所以如果我们script1.sh
从当前脚本/进程内部调用,那么script1.sh
将从当前脚本中获取导出的变量,如果script1.sh
调用script5.sh
,并且script5.sh
调用script10.sh
,那么这两个脚本也将自动获取导出的变量。这与上面的手动情况形成对比,在手动情况下,只有在调用脚本时使用手动设置的变量明确调用的脚本才会获取它们,因此子脚本不会自动从其调用脚本中获取任何变量!
如何“取消导出”变量
请注意,一旦您导出了一个变量,调用unset
它将“取消导出它”,如下所示:
# set and export `some_var` so that sub-processes will receive it
export some_var="something"
script1.sh # this script automatically receives `some_var`
# unset and un-export `some_var` so that sub-processes will no longer receive it
unset some_var
script1.sh # this script does NOT automatically receive `some_var`
总之
source
或.
进口。export
出口。unset
取消出口。
例子
创建此脚本:
源和导出.sh:
#!/bin/bash
echo "var1 = $var1"
var2="world"
然后将其标记为可执行:
chmod +x source_and_export.sh
现在我在终端运行一些命令来测试这个脚本的source
( .
) 和export
命令。在以 开头的行后面输入您看到的命令$
(不包括注释)。其他行是输出。按顺序运行命令,一次一个命令:
$ echo "$var1" # var1 contains nothing locally.
$ var1="hello" # Set var1 to something in the current process
# only.
$ ./source_and_export.sh # Call a sub-process.
var1 = # The sub-process can't see what I just set var1
# to.
$ export var1 # **Export** var1 so sub-processes will receive it.
$ ./source_and_export.sh # Call a sub-process.
var1 = hello # Now the sub-process sees what I previously set
# var1 to.
$ echo "$var1 $var2" # But, I (my terminal) can't see var2 from the
# subprocess/subscript.
hello
$ . ./source_and_export.sh # **Source** the sub-script to _import_ its var2
# into the current process.
var1 = hello
$ echo "$var1 $var2" # Now I CAN see what the subprocess set var2 to
# because I **sourced it!**
hello world # BOTH var1 from the current process and var2 from
# the sub-process print in the current process!
$ unset var1 # Unexport (`unset`) var1.
$ echo "$var1" # var1 is now NOT set in the current process.
$ ./source_and_export.sh # And the sub-process doesn't receive it either.
var1 =
$ var1="hey" # Set var1 again in the current process.
$ . ./source_and_export.sh # If I **source** the script, it runs in the
# current process, so it CAN see var1 from the
# current process!
var1 = hey # Notice it prints.
$ ./source_and_export.sh # But if I run the script as a sub-process, it can
# NOT see var1 now because it was `unset`
# (unexported) above and has NOT been `export`ed
# again since then!
var1 = # So, var1 is not exported to the subprocess.
$
使用文件作为进程之间的全局变量
有时,在编写脚本来启动程序等时,我遇到了一些export
似乎无法正常工作的情况。在这些情况下,有时必须使用文件本身作为全局变量来将信息从一个程序传递到另一个程序。以下是如何做到这一点的。在此示例中,文件的存在~/temp/.do_something
充当进程间布尔变量:
# ------------------------------------------------------------------------------
# In program A, if the file "~/temp/.do_something" does NOT exist,
# then create it
# ------------------------------------------------------------------------------
mkdir -p ~/temp
if [ ! -f ~/temp/.do_something ]; then
touch ~/temp/.do_something # create the file
fi
# ------------------------------------------------------------------------------
# In program B, check to see if the file exists, and act accordingly
# ------------------------------------------------------------------------------
mkdir -p ~/temp
DO_SOMETHING="false"
if [ -f ~/temp/.do_something ]; then
DO_SOMETHING="true"
fi
if [ "$DO_SOMETHING" == "true" ] && [ "$SOME_OTHER_VAR" == "whatever" ]; then
# remove this global file "variable" so we don't act on it again
# until "program A" is called again and re-creates the file
rm ~/temp/.do_something
do_something
else
do_something_else
fi
如上所示,简单地检查文件是否存在对于在程序和进程之间全局传递布尔条件非常有用。但是,如果您需要传递更复杂的变量(例如字符串或数字),则可能需要通过将这些值写入文件来执行此操作。在这种情况下,您应该使用文件锁定函数flock
来正确确保进程间同步。它是一种进程安全(即:“进程间”)互斥原语。您可以在此处阅读有关它的信息:
shell 脚本
flock
命令:https ://man7.org/linux/man-pages/man1/flock.1.html 。另请参阅man flock
或man 1 flock
。Linux 库 C 命令:https://man7.org/linux/man-pages/man2/flock.2.html。另请参阅
man 2 flock
。您必须#include <sys/file.h>
在 C 文件中使用此函数。
参考
询问 Ubuntu:source 与 export 与 export LD_LIBRARY_PATH
我自己的实验和测试。
我将把上述示例添加到我在 GitHub 上的项目中,
bash
文件夹为:https://github.com/ElectricRCAircraftGuy/eRCaGuy_hello_world
参见
我的个人网站文章“如何在 Bash 中编写、导入、使用和测试库?”
这更多地讨论了如何使用操作员来获取文件,以及如何通过使用这种类似 Python 的魔法使.
文件在获取文件时不运行:
if [ "$__name__" = "__main__" ]; then
main "$@"
fi
我对从 shell 脚本导入函数的回答
我对Bash 与 Python 的等效项是什么的回答
if __name__ == '__main__'
?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件