我有以下 shell 脚本:
cron_job.sh
#!/bin/bash
source /home/ec2-user/src/.config
我这样用./cron_job.sh
当我 echo$DB_NAME
包含在 .config 中时,我什么也没看到。当我剪切复制粘贴(源命令)时,我source /home/ec2-user/src/.config
会echo $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
.有一天它会引起问题。