【问题标题】:While redirect running script ouput to file overwrite the previous ouput将运行脚本输出重定向到文件时覆盖先前的输出
【发布时间】:2017-10-30 15:14:11
【问题描述】:

我从控制台运行一个 php 脚本,该脚本在处理时有多个回声,我将脚本输出重定向到文件。 我想在每次回显之后覆盖之前的回显输出。

命令:php script.php > output.json

在第一个 echo output.json 之后包含 {"属性" : "firstValue" }

在第二个 echo output.json 之后包含 {“属性”:“第一个值”}{“属性”:“第二个值”} 并且不再是有效的 json
我希望在第二个 echo ouput.json 之后包含 {“属性”:“第二值”}

【问题讨论】:

  • 能否在 script.php 的末尾回显有效的 json?
  • 脚本还在执行的时候你真的在使用写入的值吗?
  • 张贴来自script.php的关键行

标签: php shell unix


【解决方案1】:

当您希望每一行新的输出覆盖最后一行时,一次读取 1 行:

while IFS= read -r line; do
   printf "%s\n" "${line}" > output.json
done <(php script.php)

【讨论】:

    【解决方案2】:

    STDOUT 不能这样工作。如果您在单个脚本中生成多行,并且只需要最后一行,则可以通过 tail 管道输出:

    php script.php | tail -1 > output.json
    

    或者您可以在脚本中处理自己编写的文件。比如:

    ...
    file_put_contents('/path/to/file.json', $someOutput);
    ...
    file_put_contents('/path/to/file.json', $someNewOutput);
    ...
    file_put_contents('/path/to/file.json', $someEvenNewerOutput);
    

    【讨论】:

    • 我无法从脚本中编写它,因为我在另一台服务器上运行脚本并将输出重定向到当前服务器,该服务器使用脚本不可见。而且我不想要只有last message ,我希望除当前消息之外的每条消息都覆盖最后一条消息,因为输出代表脚本进度。
    • JSON 需要明确定义的格式,您不能对其进行流式传输。您可以让远程脚本输出不同的格式,该格式可以以流式方式解释(如表示完成百分比的数字列表),或者让脚本将瞬时状态输出到远程服务器上的 JSON 文件,然后不断拉取文件到您的本地服务器。
    猜你喜欢
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 2017-08-31
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多