Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从命令行使用php:如何重定向输出?_Php_Bash_Shell - Fatal编程技术网

从命令行使用php:如何重定向输出?

从命令行使用php:如何重定向输出?,php,bash,shell,Php,Bash,Shell,我是一个PHP新手。。。我通常使用bash编写脚本,在这里我可以轻松地执行以下操作: #!/bin/bash # myscript.sh function testFunction() { echo "bubu" > /dev/tty echo "gaga" } a=$(testFunction) echo $a > t 如果我在shell中运行它,我会得到以下结果: $ ./myscript.sh bubu $ cat t gaga $ ./myscript.sh $

我是一个PHP新手。。。我通常使用bash编写脚本,在这里我可以轻松地执行以下操作:

#!/bin/bash

# myscript.sh

function testFunction() {
 echo "bubu" > /dev/tty
 echo "gaga"
}
a=$(testFunction)
echo $a > t
如果我在shell中运行它,我会得到以下结果:

$ ./myscript.sh
bubu
$ cat t
gaga
$ ./myscript.sh
$ cat t
bubu
gaga
现在,如果我有一个PHP文件而不是函数,如何获得相同的输出

// my script.php
echo "bubu";
echo "gaga";
Bash脚本:

#!/bin/bash

# myscript.sh

a=$(php myscript.php)
echo $a > t
如果我在shell中运行它,我会得到以下结果:

$ ./myscript.sh
bubu
$ cat t
gaga
$ ./myscript.sh
$ cat t
bubu
gaga
如何告诉php脚本将
“bubu”
发送到
/dev/tty

我试着和ob_start和他的朋友们一起玩,但没有得到任何结果

$ php script.php > /dev/tty
这就是诀窍:)

编辑/

我明白了,你只想要“bubu”

因此,您应该执行以下操作:

file_put_contents('/dev/tty', 'bubu');

您可以在PHP中使用stdout/stderr分割输出,请参见stackoverflow问题。然而,这需要将
myscript.php
中的所有“bubu”
echo
语句调整为如下内容:

fwrite(STDERR, "bubu");
然后将stderr重定向到Bash包装器中的文件
bubu
,以获取所有“bubu”行,而所有“gaga”行将显示在终端上:

php myscript.php 2> bubu

这会将所有内容发送到那里(这在某种程度上已经是默认的),并且不会按照OP想要的方式分割输出。谢谢michael。。。但是:在php中有没有一种方法可以在不写入文件的情况下向stderr发送某些内容?如果在cicle中运行,它听起来相当昂贵,不是吗?
fwrite
在这种情况下不会写入实际文件,因此PHP部分没有磁盘I/O。您不应该为每次写入调用
fopen
,但只需在程序启动时调用一次即可。还有另一种使用的方法,除非将
error\u log
设置为特定文件,但与
fwrite
相比,这会进一步降低性能。我的测试设置(一个简单的循环)完成了10000次迭代,其中
echo
在35毫秒内完成,
fwrite
在41毫秒内完成,而
error\u log
在45毫秒内完成。太好了,这绝对是一个不错的解决方案。。。非常感谢!您甚至不需要在命令行中打开该流句柄。我已相应地编辑了答案。