Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
拦截标准输出/传递应用程序输出(Shell/C/PHP)_Php_C_Fonts - Fatal编程技术网

拦截标准输出/传递应用程序输出(Shell/C/PHP)

拦截标准输出/传递应用程序输出(Shell/C/PHP),php,c,fonts,Php,C,Fonts,我正在运行一个混合的shell脚本和一个C应用程序,以允许以root执行。我正在使用它从用PHP编写的网站对FontForge进行一些转换。我的问题是,当FontForge遇到一些问题时,它会将错误信息输出到标准输出。我目前正在捕获该输出并对其进行关键字分析,以生成一些错误消息 问:我想知道我是否可以以某种方式将输出重定向到某个变量,并将其传递回PHP进行处理——只要当前的解决方案在浏览器下运行良好,不幸的是,当我运行单元测试时,我会得到一页失败的glyph映射信息,这些信息只会掩盖结果。我想完

我正在运行一个混合的
shell脚本
和一个
C
应用程序
,以允许以root执行。我正在使用它从用
PHP
编写的网站对
FontForge
进行一些转换。我的问题是,当FontForge遇到一些问题时,它会将错误信息输出到标准输出。我目前正在捕获该输出并对其进行关键字分析,以生成一些错误消息

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

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

PHP:

脚本(转换字体):

C(pfb2otf):

输出

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

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


希望这能有所帮助。

有三件事需要注意:

1) 您的程序可能会在错误输出中写入错误,若要获得这些错误,您需要添加
2>&1

$new_path = exec("./convert_font " . $file . " " . $file2 . ' 2>&1');
2) exec()只返回命令执行的最后一行,获取返回值的最安全方法是将第二个参数传递给exec()

您可能会注意到$return是一个具有1行/条目的多维数组。因此,为了确保将错误输入到该数组中,您可以执行以下操作:

$new_path = implode("", $return); 
3) 不要忘记在文件中有空格(至少)或反引号/括号/美元(…shell可以解释的所有内容)的情况下使用

#!/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);
$new_path = exec("./convert_font " . $file . " " . $file2 . ' 2>&1');
$return = array();
exec("./convert_font " . $file . " " . $file2 . ' 2>&1', $return);
$new_path = implode("", $return); 
$return = array();
exec("./convert_font " . escapeshellarg($file) . " " . escapeshellarg($file2) . ' 2>&1', $return);