2010-08-08 5 views
0

Il peut être utile si vous êtes sur un Mac et utilisez TextMate, mais pas entièrement nécessaire.Comportement Bizarre script shell php

Ma position php:

$which php 
/opt/local/bin/php 

Le script:

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

Le -n pour supprimer l'écho de la nouvelle ligne qui est automatiquement ajouté à toutes les commandes d'écho shell.

Si je lance le code php ci-dessus de la coquille:

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

je me retrouve avec 'out.txt', dont le contenu étant:

-n my-string 

Si je lance exactement même code dans TextMate, le contenu de « out.txt » sera correcte:

my-string 

Je ne peux pas les chiffres sur ce que PHP est à l'esprit h en mettant la chaîne littérale '-n' dans la sortie. Je me demande vraiment pourquoi TextMate fait la bonne chose. J'ai vérifié que les deux utilisent le même php, php -i montre la plupart du temps les mêmes choses, bien sûr il y a des différences quand on exécute TextMate, l'autre dans le shell, donc une sortie a des pointeurs vers le fichier alors que l'autre 't. Autant que je sache, $ PATH et $ ENV sont les mêmes.

J'ai essayé une poignée de méthodes différentes pour contourner ce problème. En fait, je ne serai pas en mesure d'utiliser une solution de contournement, car cela a été ramené à un cas simple pour l'envoi à SO. Mon cas d'utilisation de cette pipe à pbcopy, que je croyais être une fonctionnalité de Mac OS X seulement, j'ai donc utilisé >> redirection ici parce que c'est universel.

Finalement, je veux un résultat sur mon presse-papiers qui n'a pas de saut de ligne, ce qui est dangereux car coller dans un shell va exécuter tout ce qui l'a précédé.

Merci

+0

Je ne peux pas reproduire: $ php -r "shell_exec (\" echo -n 'my-string'> out.txt \ ");" glopes @ nebm: ~ $ cat out.txt my-string – Artefacto

+0

Pourquoi ne pas utiliser les guirlandes? – EricR

Répondre

3

Est-il possible que php appelle un écho différent de votre shell construit en écho? De nombreuses versions de echo ne prennent pas en charge -n et l'afficheront en tant que partie de votre chaîne. Vous pouvez essayer shell_exec("which echo"); pour savoir s'il est en cours d'exécution.

Notez que printf n'affichera pas la nouvelle ligne sauf si vous l'ajoutez explicitement. Vous pouvez donc utiliser which printf pour savoir où cela se trouve et l'appeler à la place.

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

+0

Bien, je suis revenu ici pour poster que j'ai finalement arrêté de me cogner la tête contre le mur et que je l'ai figuré, mais tu l'as aussi. J'ai forcé une erreur sur la ligne pour que je puisse voir ce que l'obus appelait et je n'ai pas été retrouvé, ce qui m'a conduit à un moment de silence. Donc, ajouté le chemin complet à l'écho et tout va bien. Merci tout le monde. – user170579

0

PHP diffère simplement l'appel à popen dans les plates-formes Unix. Voir le manual page pour Mac OS X:

L'argument de commande est un pointeur vers une chaîne terminée par un caractère nul contenant une ligne de commande shell. Cette commande est transmise à/bin/sh en utilisant l'option -c; l'interprétation, le cas échéant, est effectuée par le shell.

il devrait donc être la même que celle qui /bin/sh -c "echo -n 'my-string' > out.txt"