奇怪的php shell脚本行为

时间:2010-08-08 18:46:45

标签: php newline echo

如果您使用Mac并使用TextMate,这可能有所帮助,但并非完全必要。

我的php位置:

$which php  
/opt/local/bin/php

剧本:

#!/opt/local/bin/php 
<?php
    shell_exec("echo -n 'my-string' > out.txt");
?>

回显的-n抑制自动添加到所有shell echo命令的换行符。

如果我从shell运行上面的PHP代码:

chmod u+x myfile.php
./myfile.php

我最终得到'out.txt',其内容为:

-n my-string

如果我在TextMate中运行完全相同的代码,'out.txt'的内容将是正确的:

my-string

在输出中输入文字字符串'-n',我无法弄清楚php是什么。我真的很想知道为什么TextMate会做正确的事情。我已经检查过两者都使用相同的php,php -i显示大多数相同的东西,当然有差异,因为一个在TextMate中运行,另一个在shell中,所以一个输出有指向文件而另一个没有“T。据我所知,$ PATH和$ ENV是相同的。

我尝试了一些不同的方法来解决这个问题。实际上我无法使用解决方法,因为这已经被简化为发布到SO的简单案例。我用这个管道到pbcopy的用例,我认为它只是Mac OS X的一个特性,所以我使用了&gt;&gt;这里重定向,因为这是普遍的。

最终,我想在我的剪贴板上找到一个没有尾随换行符的结果,这样做很危险,因为粘贴在shell中会执行前面的任何操作。

由于

2 个答案:

答案 0 :(得分:3)

php是否可能调用与echo内置的shell不同的回声?许多版本的echo不支持-n,并会将其作为字符串的一部分输出。

您可以尝试shell_exec("which echo");找出它正在运行的内容。

请注意,除非您明确添加,否则printf不会显示新行。因此,您可以使用which printf找出它所在的位置并改为调用它。

shell_exec("/usr/local/bin/printf '%s' 'mystring' > out.txt");

答案 1 :(得分:0)

PHP只是将调用推迟到Unix平台中的popen。请参阅适用于Mac OS X的manual page

  

command参数是指向包含shell命令行的以null结尾的字符串的指针。这个        使用-c标志将命令传递给/ bin / sh;解释,如果有的话,由shell执行。

所以它应该与运行/bin/sh -c "echo -n 'my-string' > out.txt"

相同