为什么我的一些shell_exec有时会因管道破裂而失败,而仍然产生必要的输出?

时间:2019-05-16 04:08:13

标签: php bash shell exec

我写了一个非常复杂,非常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

(我已经看到了我懒惰的方式的错误,将重写整个部分,但是那时候我还很年轻,没有经验,也没有耐心。我仍然想知道为什么出了什么问题。)

  1. 有时会导致什么?输入始终是jq的精美印刷的JSON,结构不同。

  2. 即使它确实收到了管道破损消息,仍会解析出必要的值并将其存储在变量中。那是什么导致它死亡呢?我想知道将来是否有办法使PHP忽略[非致命性]错误并继续执行。

  3. 在bash中手动调用时,为什么在shell_exec中生成破损管道错误消息的shell命令的行为没有什么不同?破损的管子在哪里,是什么造成的?

1 个答案:

答案 0 :(得分:0)

编辑:

如果这是要执行的bash命令,则可以删除cat命令。我会这样写。

$jq1=grep -Po --color=none "\w{3,15}"|"\[" -m 1 file.txt | jq \'.\';
$jq1=trim(shell_exec($jq1));

我组合了多余的grep命令,并将文件添加到grep命令中,然后仅通过管道传输了jq命令。