2010-08-08 67 views
0

如果你在Mac上并使用TextMate,虽然不是完全必要,但它可能会有所帮助。奇怪的PHP shell脚本行为

我的PHP的位置:

$which php 
/opt/local/bin/php 

脚本:

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

的-n回声抑制,自动添加到所有外壳回声命令的换行符。

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

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

我最终“out.txt”,其内容之中的:

-n my-string 

如果我运行的确切内TextMate的相同的代码,“out.txt”中的内容将是正确的:

my-string 

我不能什么PHP数字高达机智h将字符串'-n'放在输出中。我真的很想知道为什么TextMate做的是正确的事情。我已经检查过,两者都使用相同的PHP,php -i显示的内容大多是相同的东西,当然在TextMate中运行,另一种在shell中有差异,所以一个输出具有指向该文件的指针,而另一个不指向“T。据我所知,$ PATH和$ ENV是相同的。

我已经尝试了几种不同的方法来解决这个问题,这些方法都不起作用。我实际上将无法使用解决方法,因为这已经被提炼成一个简单的案例来发布到SO。我的这个管道用于pbcopy的用例,我相信它只是一个Mac OS X特性,所以我在这里使用了>>重定向,因为这是通用的。

最终,我希望我的剪贴板上没有拖尾换行符的结果,因为粘贴在shell中会执行前面的任何内容,这是危险的。

感谢

+0

我无法重现:$ PHP -r “了shell_exec(\” 回声-n '我的字符串'> out.txt \ “);” glopes @ nebm:〜$ cat out.txt my-string – Artefacto 2010-08-08 18:51:49

+0

为什么不使用反引号? – EricR 2010-08-08 18:52:52

回答

3

难道PHP是调用不同的回波比你的shell内置回音? echo的许多版本不支持-n,并将其输出为字符串的一部分。

你可以尝试shell_exec("which echo");找出它正在运行。

请注意,printf将不会显示新行,除非您明确添加它。因此,您可以使用which printf来确定它驻留的位置,然后调用它。

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

+0

不错,我回到这里后发现,我终于停止了将我的头撞在墙上,把它弄糊涂了,但你也明白了。我强迫线上发生了一个错误,所以我可以看到shell在调用什么,并且我没有发现,这导致了我一个尴尬的时刻。所以,增加了完整的回声路径,一切都很好。感谢大家。 – user170579 2010-08-08 19:17:22

0

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

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

所以应该是相同的运行/bin/sh -c "echo -n 'my-string' > out.txt"