我有一个 shell 脚本,它设置一些环境变量,我通过命令运行这些变量source
来影响当前的 shell。我创建了另一个引用此 shell 脚本的 shell 脚本,并且我认为source
在另一个 shell 脚本内调用与直接在当前 shell 上调用具有相同的效果,但显然情况并非如此。是否有办法告诉这个调用者脚本,无论适用于它运行的 shell 的内容都应该反映到当前 shell 中?
带有环境变量的脚本以开头,set -a
所以我想做类似的事情
$(cat env_script.sh)
会将所有内容导出到调用 shell,但这似乎也不起作用。
答案1
您的方法不起作用有两个原因。
首先,我们假设您的 env_script.sh 包含一条设置变量的语句,例如
X=5
如果执行该语句
$(cat env_script.sh)
您要求 bash 作为命令运行此脚本的内容,即执行具有有趣名称的程序X=5
。
因此,将定义带入 shell 的正确方法是
. env_script.sh
第二个问题是,根据您的写作,您希望将变量传播到“调用者脚本”。现在还不完全清楚“调用者脚本”到底是什么意思,但是如果这个调用者脚本不是反过来采购您将要编写的脚本,但将其作为子进程调用,技术上无法将变量直接传递给调用者。
简而言之,如果 shell 需要设置变量,并且设置是在单独的文件中定义的,则它需要来源命令来导入它们。
答案2
这是一个例子
#!/bin/bash
CURR_DIR=$(dirname $(readlink -f $0))
. ${CURR_DIR}/set-env-script.sh
# Add here your code...