2011-12-27 20 views
8

Posso ricevere input da una pipe e da un heredoc e usarli entrambi da php sulla riga di comando.php stdin da pipe bash e heredoc

voglio fare qualcosa di simile:

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

Che dovrebbe restituire il risultato di ls -l

Inoltre, posso usare php -R con ingresso heredoc per script PHP?

+0

@DaveRandom In * bash *, ** Here String ** richiede tre '<' e ** Here Document ** due '<'. –

+0

@Shiplu Ritraggo la mia pedanteria e ammetto la sconfitta (nel senso che non avevo mai incontrato prima nel contesto di bash). Il commento deve essere cancellato ... – DaveRandom

+0

@DaveRandom: Pedanticism richiede che tu smetta di scrivere apostrofi in luoghi inappropriati. –

risposta

9

tubazioni

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


heredoc

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

combinata

$ 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: Quando si utilizza Qui Documenti per php il comando appena aggiunto php codici sostituisce il precedente stdin

+0

Quindi quello che stai dicendo è che quando si combinano tubazioni ed heredoc, la parte convogliata viene calpestata dalla parte heredoc e non può essere recuperata? –

+0

@BillyMoon si. Non può essere ripresentato. –

1

Per quanto riguarda la -R parte della domanda:

-R/--process-code

codice PHP da eseguire per ogni riga di input. Aggiunto in PHP 5.

In questa modalità sono disponibili due variabili speciali: $argn e $argi. $argn conterrà la linea che PHP sta elaborando in quel momento, mentre $argi conterrà il numero di riga. Docs

Se ho capito la tua domanda giusta, siete alla ricerca per la variabile $argn. Heredoc dovrebbe essere supportato dal tuo bash.

Edit: Err, basta invocare con il valore su più righe:

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

(penso che sia più facile da usare la sola offerta per l'interruttore)

+0

Non riesco a capire come passare un heredoc a 'php -R' invece di una stringa, e non sono sicuro che sia possibile direttamente. –

+0

Il mio male, basta provare una "stringa" multilinea invece di un heredoc. Modificato la domanda per riflettere questo. – hakre

+0

Wow, stringa multi-linea - che rivelazione. Semplice ed elegante, non ne ho idea ... ho passato troppo tempo a scrivere javascript ultimamente! –