假设我在PHP CLI上的shell脚本中运行以下PHP脚本:
<?php
# foo.php
$a = rand(1,5);
if ($a == 1) {
fwrite(STDOUT, 'normal condition');
} else {
fwrite(STDERR, 'error condition');
}
脚本在shell中运行如下:
php foo.php
如何根据输出是STDERR还是STDOUT在shell中处理PHP脚本的输出?例如,如果PHP脚本的输出是STDOUT,则将其写入CSV文件,但如果输出是STDERR,则将输出写入错误日志文件。
2条答案
按热度按时间tpxzln5u1#
您可以将每个流重定向到不同的位置。
php file.php > outfile.csv 2> errorlog.txt
有关详细信息,请参见https://askubuntu.com/questions/625224/how-to-redirect-stderr-to-a-file
iyr7buue2#
产生单个输出文件的一些可能性。
选项1 -将
stdout
和stderr
重定向到单独的文件,然后删除空文件:如果文件长度为零,则
! -s
测试将为true。这个版本使用了一些相当常见的shell习惯用法,并且应该可以在zsh
和bash
中工作。这些操作可以组合成一个函数:选项2 -将
stdout
和stderr
保存在shell变量中,只有在有输出时才创建文件:部分作品:
>
,2>
-重定向stdout
和stderr
。>(...)
- process substitution。shell创建一个子进程(类似于-见下文)并将我们重定向到该进程的输出发送给该进程。t=$(<&0)
-将子进程的stdin
存储在变量t
中。[[ -n ... ]]
-测试字符串是否为非空。<<<... > ...
-使用here-string将变量内容写入文件。此版本带有一些警告:
zsh
的(或者更准确地说,在我对bash
进行的非常简短的测试中,它没有工作)。zsh
内置的,因此shell在单个进程中同步运行它们。此模式的其他变体可能会有不同的行为-如果这是一个问题,则zsh文档描述了一个解决方法。这也可以写成一个函数:
替代解决方案:
php
命令是否成功。php
代码,则该脚本可以直接写入数据和错误文件,而不是通过shell传递信息。