2010-08-08 66 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"