0

我正在运行一个混合shell script和一个C应用程序to allow execution as root。我正在使用它FontForge从用PHP. 我的问题是,当 FontForge 遇到一些问题时,它会将错误信息喷出到标准输出中。我目前正在捕获该输出并将其解析为关键字以生成一些错误消息。

问:我想知道我是否可以以某种方式将该输出重定向到某个变量并将其传递回 PHP 进行处理 - 只要当前解决方案在浏览器下工作正常,不幸的是,当我运行单元测试时,我会得到一些失败的字形映射信息页面只不过掩盖了结果。我想完全绕过 std_out 。

我对 C 或 shell 脚本都不是很熟悉,所以请不要笑:)。这是我所拥有的:

PHP:

[...]
$new_path = exec("./convert_font " . $file . " " . $file2);
if (strpos($new_path, 'Save Failed') !== false) {
   // throw exception or something
}
[...]

脚本(convert_font):

#!/bin/bash

PATH=/usr/local/bin:$PATH
FONTFORGE_LANGUAGE=ff
export PATH FONTFORGE_LANGUAGE

if (test -f $1); 
 then 
  a=$(./pfb2otf $1 $2 2>&1)
fi

echo $a

C (pfb2otf):

#!/usr/bin/fontforge
//Opens file
Open($1);
Reencode("unicode"); 
//Makes conversion to otf
Generate($2+".otf"); 
//Prints the resulting name (if conversion is successful) to STD_OUT so I can capture it with my bash script to send back to PHP and consider operation successful to
Print($2+".otf");  
Quit(0);
4

2 回答 2

1

http://php.net/manual/en/function.exec.php

输出

如果存在输出参数,则指定的数组将填充命令的每一行输出。此数组中不包含尾随空格,例如 \n。请注意,如果数组已经包含一些元素,则 exec() 将附加到数组的末尾。如果您不希望函数附加元素,请在将数组传递给 exec() 之前对数组调用 unset()。

您可以使用 PHP 代码中的附加输出参数将所有标准输出消息捕获到数组中。您还可以在 perl 和 C 中将 stderr 重定向到 stdout

http://www.masaokitamura.com/2009/08/how-to-redirect-stderr-to-stdout-in-perl/

希望这可以帮助。

于 2012-09-14T07:42:47.810 回答
1

有 3 点需要注意:

1)您的程序可能会在错误输出上写入错误,要获取它们也需要添加2>&1

$new_path = exec("./convert_font " . $file . " " . $file2 . ' 2>&1');

2) exec() 仅返回命令执行的最后一行,获取返回值的最安全方法是将第二个参数传递给 exec()。

$return = array();
exec("./convert_font " . $file . " " . $file2 . ' 2>&1', $return);

您可能会注意到 $return 是一个多维数组,包含 1 行/条目。因此,为了确保您将错误放入此数组中,您可以这样做:

$new_path = implode("", $return); 

3)不要忘记使用escapeshellarg,以防您的一个文件有空格(至少)或反引号/括号/美元(...shell可以解释的所有内容)。

$return = array();
exec("./convert_font " . escapeshellarg($file) . " " . escapeshellarg($file2) . ' 2>&1', $return);
于 2012-09-14T07:48:34.447 回答