【问题标题】:Bizarre php shell script behavior奇怪的 php shell 脚本行为
【发布时间】:2010-08-08 18:46:44
【问题描述】:

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

我的php位置:

$which php  
/opt/local/bin/php

脚本:

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

回显的 -n 禁止自动添加到所有 shell 回显命令的换行符。

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

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

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

-n my-string

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

my-string

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

我尝试了几种不同的方法来解决这个问题,但都没有奏效。实际上,我将无法使用解决方法,因为这已被简化为发布到 SO 的简单案例。我将此管道连接到 pbcopy 的用例,我认为这是 Mac OS X 独有的功能,所以我在这里使用 >> 重定向,因为这是通用的。

最终,我希望剪贴板上的结果没有尾随换行符,这很危险,因为将其粘贴到 shell 中会执行它之前的任何内容。

谢谢

【问题讨论】:

  • 我无法重现:$ php -r "shell_exec(\"echo -n 'my-string' > out.txt\");" glopes@nebm:~$ cat out.txt 我的字符串

标签: php newline echo


【解决方案1】:

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

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

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

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

【讨论】:

  • 很好,我回到这里发布我终于停止用头撞墙并弄清楚了,但你也明白了。我强制在线出错,这样我就可以看到 shell 正在调用什么,但我得到了 sh -n not found,这让我陷入了一个糟糕的时刻。因此,添加了 echo 的完整路径,一切都很好。谢谢大家。
【解决方案2】:

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

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

所以应该和运行/bin/sh -c "echo -n 'my-string' &gt; out.txt"一样

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-14
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 2015-06-02
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多