2011-12-27 87 views
8

我可以从管道和heredoc接收输入,并且可以在命令行中通过php使用它们。php stdin从bash pipe和heredoc

我想要做这样的事情:

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

应返回的ls -l

的结果还有,我可以用php -R与定界符输入PHP脚本?

+0

@DaveRandom在*庆典* **这里String **需要三个'<'和** Here Document **两个'''。 – 2011-12-27 21:29:42

+0

@Shiplu我收回我的贞操并承认失败(因为我之前从未在bash中遇到过)。评论将被删除... – DaveRandom 2011-12-27 21:32:12

+0

@DaveRandom:迂腐主义要求你停止在不恰当的地方写撇号。 – 2011-12-27 21:37:40

回答

9

管道

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


定界符

$ 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部分践踏,并且不能被检索? – 2011-12-27 21:50:33

+0

@BillyMoon是的。它不能被回收。 – 2011-12-28 04:28:53

1

就问题的-R部分:

-R/--process-code

为每个输入行执行的PHP代码。在PHP 5中添加。

此模式下有两个特殊变量可用:$argn$argi$argn将包含PHP正在处理的那一行,而$argi将包含行号。 Docs

如果我理解正确你的问题,你要寻找的$argn变量。 Heredoc应该由你的bash支持。

编辑:犯错,只是与值调用多行:

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

(我认为这是更容易使用单引号交换机)

+0

我无法弄清楚如何将heredoc传递给'php -R'而不是字符串,并且我不确定这是否可以直接使用。 – 2011-12-27 21:52:07

+0

我的不好,只是尝试多行“字符串”,而不是heredoc。编辑这个问题来反映这一点。 – hakre 2011-12-27 22:15:32

+0

哇,多行字符串 - 什么是启示。简单而优雅 - 我不知道......我最近花了太多时间写javascript! – 2011-12-27 22:19:46