2011-12-27 25 views
8

¿Puedo recibir información tanto de una tubería como de un heredoc, y usarlas desde dentro de php en la línea de comandos?php stdin de bash pipe y heredoc

quiero hacer algo como esto:

bash$ ls -l | php <<'code' 
<?php 
    echo $piped; 
?> 
code 

que debe devolver el resultado de ls -l

Además, se pueden utilizar con la entrada php -R heredoc para el script PHP?

+0

@DaveRandom En * golpe *, ** Aquí String ** necesita tres '<' y ** Aquí Documento ** dos '<'. –

+0

@Shiplu Me retracto de mi pedantería y admito la derrota (ya que nunca me había encontrado con eso en el contexto de bash antes). El comentario se eliminará ... – DaveRandom

+0

@DaveRandom: Pedadicidad requiere que deje de escribir apóstrofes en lugares inapropiados. –

Respuesta

9

tuberías

ls -l | php -r 'print_r(file("php://stdin"));'


Heredoc

$ php <<CODE 
<?php 
echo "Hello World\n"; 
?> 
CODE 
Hello World 

Combinado

$ ls -l | php <<'CODE' 
<?php 
$f = file("php://stdin"); 
foreach($f as $k=>$v){ 
echo "[$k]=>$v"; 
} 
?> 
Program Finished 
CODE 

[0]=><?php 
[1]=>$f = file("php://stdin"); 
[2]=>foreach($f as $k=>$v){ 
[3]=>echo "[$k]=>$v"; 
[4]=>} 
[5]=>?> 
[6]=>Program Finished 
Program Finished 

Nota: Cuando se utiliza Aquí Documentos para php comando de los recién añadidos php códigos suplanta al anterior stdin

+0

Entonces, ¿qué está diciendo es que cuando combina tuberías y heredoc, la parte heredada es pisoteada por la parte heredoc y no se puede recuperar? –

+0

@BillyMoon sí. No puede ser recuperado. –

1

En cuanto a la parte -R de la pregunta: ¿

-R/--process-code

código PHP para ejecutar para cada línea de entrada. Añadido en PHP 5.

Hay dos variables especiales disponibles en este modo: $argn y $argi. $argn contendrá la línea que PHP está procesando en ese momento, mientras que $argi contendrá el número de línea. Docs

Si he entendido su pregunta correcta, que busca la variable $argn. Heredoc debe ser compatible con tu bash.

Editar: Err, simplemente invocar con el valor en varias líneas:

$ ls -l | php -R ' 
printf("#%02d: %s\n", $argi, $argn); 
' 

(creo que es más fácil usar la comilla simple para el interruptor)

+0

No puedo averiguar cómo pasar un heredoc a 'php -R' en lugar de una cadena, y no estoy seguro de que sea posible directamente. –

+0

Malo, simplemente intente con una "cadena" multilínea en lugar de un heredoc. Editó la pregunta para reflejar eso. – hakre

+0

Wow, cadena multilínea: qué revelación. Simple, y elegante - No tengo ni idea ... ¡He pasado demasiado tiempo escribiendo javascript últimamente! –