【问题标题】:Bash config file for perl cgi scriptperl cgi 脚本的 Bash 配置文件
【发布时间】:2015-09-15 15:37:46
【问题描述】:

我想使用 bash 文件作为我的项目配置文件,这样无论语言如何(尤其是 bash 和 perl),所有脚本都可以使用相同的配置文件。

这不是命令行的问题

$ source configfile.sh
$ ./perlscript.pl

但在 cgi 脚本中,答案并不那么清楚。

一种方法是使用 bash cgi 文件来执行 perl 脚本。

#!/usr/bin/env bash
# mycgiscript.cgi
source /path/to/configfile.sh
perl /path/to/perlscript.pl
# i think the print functions in perlscript just output to the browser?

但如果我这样做了,那么 bash 将处理所有的 http 参数解析,除非我弄错了,否则任何 perl 的 cgi 功能和模块都会变得毫无用处。由于 perl 无论如何都会做所有的工作,似乎使用 cgi 进行参数传递应该是自然的,但也许让 bash 管理 http 请求没有真正的问题?

另一种方法是使用 Perl CGI 文件解析配置文件,并根据解析设置环境变量。 configfile.sh 中的变量虽然相互引用,但会导致复杂的解析和令人头疼的问题。

那么,在 cgi 脚本中使用 bash 配置文件设置项目特定配置/环境变量的最佳做法是什么?

【问题讨论】:

  • configfile.sh 实际上在做什么?只是设置环境变量?
  • 是的,只是设置和导出环境变量,我更新了问题。但是,这些变量相互引用,因此更改一个变量会改变其他变量。
  • 为什么不使用 bash 和 perl 脚本解析并相应设置其环境的格式正确的配置文件?
  • 我倾向于同意罗恩的观点。如果您问我,由于所有的间接性,您的初始解决方案中有太多“魔法”。我会选择一种可以普遍解析的简单格式,然后走这条路。
  • “正确”或“简单”格式是指一堆VAR=HARDCODED_VALUE 语句吗?还是VAR=$VAL1/VALPART2 仍然符合条件?

标签: bash perl cgi


【解决方案1】:

其中大部分内容有点老套,但我喜欢保持配置集中的想法,所以让我们看看它是如何进行的。

如果您正在编写 CGI 脚本,则需要一个 Web 服务器。让我们假设这个答案是 apache。

有几种选择:

重新配置 apache

因此您可以将配置脚本添加到 apache 的启动脚本中。这将在启动 apache 之前设置您的环境变量,并且这些变量应该由包括您的 CGI 脚本在内的子进程继承。

解析配置文件

如果您没有对配置文件中的 shell 做任何特殊处理,那么在 Perl 中解析它应该很简单。 Shell::Parser 是一个预先存在的模块,似乎非常彻底地解决了这个问题。

处理配置文件

如果您在配置文件中使用有趣的 shell 技巧,让 shell 运行它然后查看环境中剩下的内容可能会更容易。您的 CGI 可以运行如下脚本:

source config.sh    # read config
env                 # print out environment

然后在 Perl 中解析来自env 的输出。

真实配置库

如果您对更大的重写感兴趣,我建议您选择App::Config。它不会让您将配置保存在 shell 文件中,但您可以编写一个 Perl 脚本,从 App::Config 配置生成您的 shell 配置。

【讨论】:

  • 不错的选择。我不想更改整个 apache 环境,以防某些变量影响其他 Web 应用程序。 Shell 解析器看起来很有趣,但实际上 AppConfig 看起来最适合我的简单配置文件。使用我现有的配置文件的唯一问题是导出语句。也许我会直接删除导出语句,然后在剩下的部分使用 AppConfig。
  • 不错的选择,这是最简单的选项。我在 App::Config 上很幸运,它真的做到了。
猜你喜欢
  • 2012-10-15
  • 1970-01-01
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 2010-10-08
相关资源
最近更新 更多