在多个脚本中定义公共变量?

时间:2014-12-01 10:45:21

标签: bash perl variables configuration perl-module

我有许多与功能无关的Bash和Perl脚本,但它们的相关之处在于它们在同一个项目中工作。 它们在同一个项目中工作的事实意味着我通常指定相同的目录,相同的项目特定命令,每个脚本顶部的相同关键字。

目前,这并没有让我感到困惑,但据我所知,将所有这些值集中在一个地方会更容易,如果发生了变化,我可以更改一次值并让各种脚本接受这些更改。

问题是 - 如何最好地声明这些值?一个需要的单个Perl脚本'在每个脚本中,对Perl脚本的更改要求较少,但不提供Bash脚本的解决方案。使用" key = value"的配置文件格式可能更普遍,但要求每个脚本解析配置并有可能引入问题。还有更好的选择吗?使用环境变量?或者Perl可以轻松执行和解释的Bash特定方式?

2 个答案:

答案 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'};