从其他cgi脚本调用cgi脚本

Eri*_*rik 1 perl cgi

我发现使用perl cgi的一个令人费解的行为 - 我猜 - 有一个完全有效的解释,但我找不到一个.stackoverflow上有这个问题,但它描述的内容似乎对我失败了.情况:我有两个perl cgi脚本.其中一个(让我们说script.pl)可以独立生成一个网站,但也有一个参数让我们调用它,BARE这样它就可以简单地吐出非格式化的信息.

#!/usr/bin/perl                                                                                                                                                                                                                   

use strict;
use CGI;

my $cgi = new CGI;

unless ( defined $cgi->param('BARE') ) {
    print $cgi->header, $cgi->start_html,$cgi->h1('Hello World'), $cgi->end_html;
} else {
    print "Bare";
}
Run Code Online (Sandbox Code Playgroud)

现在,我试图将其"BARE"参数设置为本地脚本(因为它们位于同一目录中)从另一个脚本调用此脚本(让我们调用它call_my_script.pl).

#!/usr/bin/perl                                                                                                                                                                                                                   

use strict;    
use CGI;

my $cgi = new CGI;

my $result = qx(./script.pl "BARE=1");

print $cgi->header,$cgi->start_html,$result,$cgi->end_html;
Run Code Online (Sandbox Code Playgroud)

从命令行运行此脚本时,我得到:

> ./call_my_script.pl 
Content-Type: text/html; charset=ISO-8859-1

<!DOCTYPE html
        PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
         "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
</head>
<body>
Bare
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

相反,我通过浏览器调用相同的脚本返回

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US"><head><title>Untitled Document</title>
</head><body>Content-Type: text/html; charset=ISO-8859-1

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html
    PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US"><head><title>Untitled Document</title>
</head><body><h1>Hello World</h1></body></html></body></html>
Run Code Online (Sandbox Code Playgroud)

因此,尽管我在本地调用第一个脚本qx并且我正在传递参数以获取裸格式,但在通过浏览器调用时不会得到尊重.

我可能忽略了一些显而易见的事情,但我很想知道它是什么.

Bor*_*din 5

CGI程序通常希望从环境变量中获取参数值QUERY_STRING.在命令行上传递参数值是一个调试工具,仅在从命令提示符运行程序时才有效

你可以尝试这样的事情

my $result = do {
    local $ENV{QUERY_STRING} = 'BARE=1';
    qx{./script.pl};
};
Run Code Online (Sandbox Code Playgroud)