为什么 echo 无法从 shell 脚本中看到源环境变量?

为什么 echo 无法从 shell 脚本中看到源环境变量?

我有以下 shell 脚本:

cron_job.sh

#!/bin/bash

source /home/ec2-user/src/.config

我这样用./cron_job.sh

当我 echo$DB_NAME包含在 .config 中时,我什么也没看到。当我剪切复制粘贴(源命令)时,我source /home/ec2-user/src/.configecho $DB_NAME看到该值。从概念上讲,这是怎么回事?以及如何使用手册页来了解正在发生的情况?

/home/ec2-user/src/.config

cat /home/ec2-user/src/.config
export DB_NAME="market"

echo_vars.sh

#!/bin/bash

echo $DB_NAME

[ec2-user@ip-172-31-28-94 ~]$ cat /etc/redhat-release
Red Hat Enterprise Linux release 8.2 (Ootpa)
[ec2-user@ip-172-31-28-94 ~]$ echo "$SHELL"
/bin/bash
[ec2-user@ip-172-31-28-94 ~]$ ./cron_job.sh
[ec2-user@ip-172-31-28-94 ~]$ ./echo_vars.sh
[ec2-user@ip-172-31-28-94 ~]$
[ec2-user@ip-172-31-28-94 ~]$ echo $DB_NAME
[ec2-user@ip-172-31-28-94 ~]$
[ec2-user@ip-172-31-28-94 ~]$ source /home/ec2-user/src/goldbase/.config
[ec2-user@ip-172-31-28-94 ~]$ ./echo_vars.sh
app_db

答案1

您正在创建一个新的 shell 来运行./cron_job.sh。它获取另一个文件,然后退出。

退出时所有变量状态都会丢失。

出口仅出口给自己和孩子。因此,当进程终止时,状态就会丢失。使用源允许脚本在同一进程中读取文件,从而保留变量。然而,当该进程终止时,它们仍然会丢失。

如果将 echo 放在 下的文件中source,那么它就会起作用。


请注意,它不是 echo 看到环境变量(它可以,但它只是不感兴趣)。该变量由 shell 扩展。

注意 shell 脚本名称不应以.sh.有一天它会引起问题。

相关内容