点(源)命令在脚本中不起作用,但在终端中起作用

Dot (source) command doesn't work in script, but works in terminal

为实验而简化的脚本文件:

#!/bin/sh 
if test -f /home/vl/docker-test/envvars; then . /home/vl/docker-test/envvars; fi

envvars 文件内容:

export APACHE_RUN_USER=www-data

运行脚本后没有任何反应,没有输出,没有错误。 检查 env 是否包含来自 envvars 的变量,不,它没有:

$ env | grep -i apache

输出为空。

但是:

$ if test -f /home/vl/docker-test/envvars; then . /home/vl/docker-test/envvars; fi
$ env | grep -i apache
APACHE_RUN_USER=www-data

我的脚本哪里做错了?

. 适用于当前 运行ning 环境。在第一种情况下,这是脚本(脚本完成后消失)。在第二种情况下,它是 shell。如果你想让脚本影响 运行 里面的 shell,那么你需要把它 . 变成 shell,而不是 运行 它作为脚本.

因此,如果您的脚本是 bring-in-vars,那么您当前正在执行类似的操作(运行将其作为 child):

./bring-in-vars

你需要这样做(将其采购到当前 shell):

. ./bring-in-vars

Children 无法按设计修改其 parents。