Странное поведение сценария PHP-оболочки - PullRequest
0 голосов
/ 08 августа 2010

Может помочь, если вы работаете на Mac и используете TextMate, хотя это и не обязательно.

Мое местоположение 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, добавив в вывод буквальную строку '-n'.Мне действительно интересно, почему TextMate делает правильные вещи.Я проверил, что оба используют один и тот же php, php -i показывает в основном одни и те же вещи, конечно, есть различия, поскольку один запускается в TextMate, другой - в оболочке, поэтому один вывод имеет указатели на файл, а другой - нет.«т.Насколько я могу судить, $ PATH и $ ENV одинаковы.

Я пробовал несколько различных методов, чтобы обойти это, ни один из которых не работает.На самом деле я не смогу использовать обходной путь, так как это было сведено к простому случаю для публикации в SO.Мой сценарий использования этого канала для pbcopy, который, как я полагал, был только функцией Mac OS X, поэтому я использовал здесь >> перенаправление, потому что оно универсально.иметь завершающий символ новой строки, который опасен, так как вставляет в оболочку то, что ему предшествует.

Спасибо

Ответы [ 2 ]

3 голосов
/ 08 августа 2010

Возможно ли, что php вызывает другое эхо, чем ваша оболочка, встроенная в эхо? Многие версии echo не поддерживают -n и выводят его как часть вашей строки.

Вы можете попробовать shell_exec("which echo");, чтобы выяснить, какой он запущен.

Обратите внимание, что printf не будет отображать новую строку, если вы не добавите ее явно. Таким образом, вы можете использовать which printf, чтобы выяснить, где он находится, и вместо этого вызвать его.

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

0 голосов
/ 08 августа 2010

PHP просто откладывает вызов popen на платформах Unix. См. справочную страницу для Mac OS X:

Аргументом команды является указатель на завершенную нулем строку, содержащую командную строку оболочки это команда передается в / bin / sh с использованием флага -c; интерпретация, если таковая имеется, выполняется оболочкой.

Так что это должно быть то же самое, что и /bin/sh -c "echo -n 'my-string' > out.txt"

...