如果您使用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中会执行前面的任何操作。
由于
答案 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"