目标:创建一个 Posix 兼容的 sh 脚本,该脚本使用源脚本创建的环境变量。
/dir/var.sh仅包含以下内容来创建环境变量。
export IPTABLES="/usr/sbin/iptables"
/dir/startup.sh包含以下内容。
#!/bin/sh
. /dir/var.sh
$IPTABLES options
command1 #Does not use an environmental variable
完成后startup.sh
,变量要么未创建,要么不存在。为什么 ?
注意:操作系统固件是只读的。它不允许编辑 /etc/profile 文件来设置所有 shell 都可用的环境变量。任何导出变量的脚本都会执行得太晚。
答案1
请参阅相关维基百科页面:
在 Unix 中,在脚本或编译程序中更改的环境变量只会影响该进程以及可能的子进程。父进程和任何不相关的进程都不会受到影响。
采购 (*) 正在当前处理中包含脚本。var.sh
因此,可以从脚本中看到脚本中定义的环境变量startup.sh
。
OTOH,startup.sh
被称为,而不是来源。因此,正如 WP 页面中提到的,它是一个子进程。当脚本结束时,在此脚本中创建的所有变量都将被丢弃。
(*)source script.sh
或者. script.sh
。正如OP评论中的其他人所述,像您所做的那样指定源脚本的相对路径是一个坏主意,. ./dir/var.sh
因为它取决于您调用的位置startup.sh
。