0

shell scriptCアプリケーションのハイブリッドを実行していますto allow execution as rootFontForgeで書かれているウェブサイトからいくつかの変換を行うために使用していますPHP。私の問題は、FontForge が何らかの問題に遭遇すると、エラー情報が標準出力に吐き出されることです。現在、その出力をキャプチャし、キーワードを解析してエラー メッセージを生成しています。

Q: どうにかしてその出力を何らかの変数にリダイレクトし、処理のために PHP に戻すことができるかどうか疑問に思っています。現在のソリューションがブラウザーで正常に動作する限り、残念ながら単体テストを実行すると、失敗したグリフ マッピング情報のページが表示されます。結果を曖昧にするだけです。std_out を完全にバイパスしたいと思います。

私は C やシェル スクリプトにあまり詳しくないので、笑わないでください :)。これが私が持っているものです:

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 コードで追加の出力パラメーターを使用して、すべての stdout メッセージを配列にキャッチできます。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() に 2 番目の引数を渡すことです。

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

$return は 1 行 / エントリの多次元配列であることに注意してください。したがって、エラーをこの配列に確実に入れるには、次のようにします。

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

3)ファイルの1つにスペース(少なくとも)または逆引用符/括弧/ドル(...シェルが解釈できるすべて)がある場合は、忘れずにescapeshellargを使用してください。

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