【问题标题】:php stdin from bash pipe and heredoc来自 bash 管道和 heredoc 的 php 标准输入
【发布时间】:2012-01-28 18:22:56
【问题描述】:

我可以同时接收来自管道和heredoc 的输入,并在命令行的php 中同时使用它们吗?

我想做这样的事情:

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

应该返回ls -l的结果

另外,我可以将php -R 与heredoc 输入一起用于php 脚本吗?

【问题讨论】:

  • @DaveRandom 在 bash 中,Here String 需要三个 &lt;Here Document 两个 &lt;
  • @Shiplu 我收回我的迂腐并承认失败(因为我以前从未在 bash 的上下文中遇到过这种情况)。评论将被删除...
  • @DaveRandom:迂腐主义要求你停止在不恰当的地方写撇号。
  • @TomalakGeret'kal 我什至不会开始讨论所有格撇号的精确语义使用,这是一场永远不会结束的辩论。你可以享受this...
  • @DaveRandom:你应该听从那个建议......我不知道关于何时应该使用撇号的任何争论。只有许多人弄错了。也请停止滥用逗号。

标签: bash php


【解决方案1】:

管道

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

注意:当您使用Here Documents for php 命令时,新添加的php 代码会覆盖之前的stdin

【讨论】:

  • 那么你的意思是当你把pipeline和heredoc结合起来的时候,piped的部分被heredoc部分践踏了,无法找回?
  • @BillyMoon 是的。无法检索。
【解决方案2】:

关于问题的-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);
'

(我觉得switch用单引号比较方便)

【讨论】:

  • 我不知道如何将heredoc传递给php -R而不是字符串,我不确定是否可以直接。
  • 我的错,只是尝试使用多行“字符串”而不是heredoc。编辑了问题以反映这一点。
  • 哇,多行字符串 - 真是一个启示。简单,优雅 - 我不知道......我最近花了太多时间编写 javascript!
  • 我发现如果我使用'来定义多行字符串,我不必转义这么多的php代码,但是有什么办法可以避免转义@ 987654333@ 在我的 php 代码中 - 所以可能使用不同的标记来分隔多行字符串?
  • @BillyMoon:最好在 PHP 代码中使用单引号。你不需要逃避那么多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 2013-04-16
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 2012-02-23
相关资源
最近更新 更多