3

有这个命令:

    $command = "diff -bBdH --ignore-all-space <(echo 'hi') <(echo 'hi1')";
    echo $command;
    $result = shell_exec($command);

在屏幕上我看到:

    sh: 1: Syntax error: "(" unexpected
    diff -bBdH --ignore-all-space <(echo 'hi') <(echo 'hi1')

如果我将控制台输出中的第二行复制粘贴到终端中,结果将是正确的。(也在另一台机器上复制)。

我在这里遗漏了一些简单的东西,看不到它是什么。


此外,为什么我的输出反转了?
我清楚地在执行命令之前回显了命令,因此 shell 的语法错误应该出现在shell_exec

4

2 回答 2

4

您的语法对 Bash 很好,但对sh. 在 Bash 中显式运行它,或者将 Bashisms 转换为经典的 Bourne shell(有点挑战性,可能需要一个临时文件)。

我不知道 PHP 是否提供了一种方法来指定要在哪个 shell 中使用shell_exec,但您至少可以为您sh运行bash。不过,嵌套引用有点棘手。

shell_exec("bash -c 'diff -bBdH --ignore-all-space <(echo \"hi\") <(echo \"hi1\")'");

标准输出和标准错误之间的输出顺序是任意的;输出缓冲可能会导致在常规打印之前打印错误消息,尽管它们以不同的顺序执行。在单个流中,您当然可以依赖有序输出。

于 2012-12-11T16:54:38.867 回答
0

您是否尝试过引用变量并在回显字符串周围加上引号?

$command = "diff -bBdH --ignore-all-space <(echo '" . $str1 ."') <(echo '" . $str2 . "')";
echo $command;

我相信引用变量总是好的做法。它使其易于阅读并有助于解决烦人的错误。

于 2012-12-11T16:35:18.340 回答