【发布时间】:2019-05-16 04:08:13
【问题描述】:
我编写了一个非常复杂、非常hackjob的PHP-cli脚本,它接收和解析可变结构、深度和内容的JSON。出于这个原因,当时我发现使用 PHP 的 shell_exec() 和 cat | jq | grep 进行解析是最容易的。
有时,很少,在某些输入上它会给我消息Error: writing output failed: Broken pipe,这是我在脚本死亡之前在 cli 输出中看到的最后一条消息。然而,即使它这样做了,数据仍然被正确解析出来,尽管它对我有一点好处。
我将有问题的代码段隔离到:
$jq1='cat '.$randfile.' | jq \'.\' | grep "\[" -m 1 | grep -Po --color=none "\w{3,15}"';
$jq1=trim(shell_exec($jq1));
并尝试通过查看它执行的内容来调试它。第一行是shell_exec参数,执行前回显,第二行是shell_exec的结果。
Command: cat 5ca15f21.json | jq '.' | grep "\[" -m 1 | grep -Po --color=none "\w{3,15}";
Result: standalone
Command: cat 5ca59379.json | jq '.' | grep "\[" -m 1 | grep -Po --color=none "\w{3,15}";
Result: season
Error: writing output failed: Broken pipe
Command: cat 5ca7d271.json | jq '.' | grep "\[" -m 1 | grep -Po --color=none "\w{3,15}";
Result: extended
Command: cat 5ca7d7a8.json | jq '.' | grep "\[" -m 1 | grep -Po --color=none "\w{3,15}";
Result: season
(我已经看到了我懒惰方式的错误,并将重写整个部分,但那时我还年轻,缺乏经验,缺乏耐心。我仍然想了解哪里出了问题。)
是什么让它有时会这样做?输入始终是 jq 的漂亮打印 JSON,具有不同的结构。
即使它确实收到了损坏的管道消息,仍然会解析出必要的值并将其存储在变量中。那是什么原因导致它死亡呢?我想知道将来是否有办法让 PHP 忽略 [非致命] 错误并继续执行。
为什么在 bash 中手动调用时,在 shell_exec 中产生损坏管道错误消息的 shell 命令的行为没有什么不同?破损的管道在哪里,是什么原因造成的?
【问题讨论】:
-
我很确定这是因为
grep -m 1只会读到第一场比赛,但jq '.'有更多话要说,当没有人在听时会感到不安。请参阅 "sed: couldn't write 26 items to stdout: Broken pipe" 以了解非常相似的错误。