我有许多与功能无关的Bash和Perl脚本,但它们的相关之处在于它们在同一个项目中工作。 它们在同一个项目中工作的事实意味着我通常指定相同的目录,相同的项目特定命令,每个脚本顶部的相同关键字。
目前,这并没有让我感到困惑,但据我所知,将所有这些值集中在一个地方会更容易,如果发生了变化,我可以更改一次值并让各种脚本接受这些更改。
问题是 - 如何最好地声明这些值?一个需要的单个Perl脚本'在每个脚本中,对Perl脚本的更改要求较少,但不提供Bash脚本的解决方案。使用" key = value"的配置文件格式可能更普遍,但要求每个脚本解析配置并有可能引入问题。还有更好的选择吗?使用环境变量?或者Perl可以轻松执行和解释的Bash特定方式?
答案 0 :(得分:5)
运行shell脚本时,它在子shell中完成,因此不会影响父shell的环境。因此,当您将变量声明为key=value
时,其范围仅限于子shell上下文。您希望通过执行以下操作来获取脚本:
. ./myscript.sh
这在当前shell的上下文中执行,而不是作为子shell执行。
来自bash手册页:
. filename [arguments]
source filename [arguments]
Read and execute commands from filename in the current shell environment and return the exit status of the last command executed from filename.
If filename does not contain a slash, file names in PATH are used to find the directory containing filename.
您还可以使用export
命令创建全局环境变量。 export
管理哪些变量可供新进程使用,所以如果你说
FOO=1
export BAR=2
./myscript2.sh
然后$BAR
将在myscript2.sh的环境中可用,但$FOO
不会。
答案 1 :(得分:2)
定义环境变量: 用户级:在〜/ .profile或〜/ .bash_profile或〜/ .bash_login或〜/ .bashrc中 系统级别:在/ etc / profile或/etc/bash.bashrc或/ etc / environment
中例如,在变量中添加两行:
FOO=myvalue
export FOO
要在bash脚本中读取此变量:
#! /bin/bash
echo $FOO
perl脚本中的:
#! /bin/perl
print $ENV{'FOO'};