2011-12-27 4 views
8

Могу ли я получать входные данные как от трубы, так и от heredoc и использовать их как внутри php в командной строке.php stdin from bash pipe и heredoc

Я хочу сделать что-то вроде этого:

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

Который должен возвращать результат ls -l

Кроме того, можно использовать php -R с входом Heredoc для PHP скрипт?

+0

@DaveRandom В * Баш *, ** Здесь String ** нуждается в трех '' 'и ** Here Document ** двух' ''. –

+0

@Shiplu Я отключаю свое педантизм и признаю поражение (в том, что я никогда не сталкивался с этим в контексте bash раньше). Комментарий должен быть удален ... – DaveRandom

+0

@DaveRandom: Педантизм требует, чтобы вы прекратили писать апострофы в неподходящих местах. –

ответ

9

Трубы

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


Heredoc

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

Комбинированный

$ 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 

Примечание: При использовании Здесь Документы для php команды вновь добавленные php коды отменяет предыдущий stdin

+0

Итак, что вы говорите, так это то, что когда вы соединяете трубопровод и heredoc, часть трубопровода растаптывается частью heredoc и не может быть восстановлена? –

+0

@BillyMoon да. Он не может быть восстановлен. –

1

Что касается -R части вопроса:

-R/--process-code

PHP-код для выполнения для каждой строки ввода. Добавлено в PHP 5.

В этом режиме доступны две специальные переменные: $argn и $argi. $argn будет содержать строку PHP, обрабатывающую в тот момент, а $argi будет содержать номер строки. Docs

Если я понял ваш вопрос правильно, вы ищете переменной $argn. Heredoc должен поддерживаться вашим bash.

Edit: Err, просто вызовите со значением по нескольким линиям:

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

(я думаю, что проще использовать одинарные кавычки для переключателя)

+0

Я не могу понять, как передать heredoc в 'php -R' вместо строки, и я не уверен, что это возможно напрямую. –

+0

Плохо, просто попробуйте многострочную «строку» вместо heredoc. Отредактировал вопрос, чтобы отразить это. – hakre

+0

Ничего себе, многострочная строка - какое откровение. Простой и элегантный - я понятия не имею ... Я потратил слишком много времени на создание javascript в последнее время! –