【问题标题】:PHP Command in script has different results than shell脚本中的 PHP 命令与 shell 的结果不同
【发布时间】:2013-12-12 02:18:55
【问题描述】:

我在 BASH 脚本中有以下几行:

ACTIONS_COMMAND="php -f $BASEDIR/scripts/activities.php < \"$SRC_DIR/%s/AndroidManifest.xml\""

printf -v ACTIONS_CMD "$ACTIONS_COMMAND" $FOLDER

$ACTIONS_CMD

这在一个循环中运行,以对多个 Android 应用程序执行相同的操作。 当我回显$ACTIONS_CMD 并复制并粘贴命令时,它会产生正确的输出,但脚本本身会启动PHP,但不会复制STDIN。我知道这是因为 PHP 挂起,直到我在键盘上按下 Ctrl-D 然后它抱怨没有输入。

我尝试将 PHP 命令切换到

ACTIONS_COMMAND="cat \"$SRC_DIR/%s/AndroidManifest.xml\" | php -f $BASEDIR/scripts/activities.php"

当第一个文件名用引号引起来时(我认为应该是为了安全起见),我得到 ​​p>

cat: "apps/app_name/AndroidManifest.xml": No such file or directory
cat: |: No such file or directory
cat: php: No such file or directory
cat: -f: No such file or directory
<?php
... REST OF PHP SCRIPT ...

没有引号,它只是输出到终端窗口。

如果重要的话,那就是GNU bash, version 3.2.51(1)-release (x86_64-apple-darwin13)

【问题讨论】:

  • 在最终构造的命令之前添加一个echo,以查看生成的内容以及可能出现的任何错误。
  • @MattWilliamson 我这样做了,结果命令在终端中手动运行良好。

标签: php bash shell


【解决方案1】:

您不能在这样的字符串中执行带有输入/输出重定向的程序。它将尝试使用管道和角度字符以及文件作为您执行的程序的输入。

您需要将该字符串传递给 shell 才能进行重定向。

一种方法是:

bash -c "$ACTIONS_COMMAND"

【讨论】: