在 bash 脚本中嵌入 php 脚本有什么问题?

在 bash 脚本中嵌入 php 脚本有什么问题?

我试图使用php内部 bash 脚本,但遇到了几个问题。我的第一次尝试失败了,出现错误,bash无法找到此处文档的末尾。仍然触发错误的最小版本如下(UPD问:为什么 bash 看不到此处文档标记的结尾?):

$ type 1.sh
#!/bin/bash -eu
cat <(cat <<SCRIPT
{
SCRIPT)
$ ./1.sh
./1.sh: line 7: warning: here-document at line 5 delimited by end-of-file (wanted `SCRIPT')
{

UPD我为帖子的其余部分创建了单独的问题。

“好吧,这样我就可以避免使用牙套了,”我决定。但事实证明第一个符号由于某种原因被切断了(UPD问:谁以及出于什么原因切断了脚本的第一个符号?与 BOM 有关系吗?):

$ type 2.sh
#!/bin/bash -eu
php <(cat <<'SCRIPT'
<?php var_dump($_SERVER['argv']);
SCRIPT)
$ ./2.sh
?php var_dump($_SERVER['argv']);

然后我试图找出是谁的错(UPD问:如何从 php 打开进程替换文件?):

$ type 3.sh
#!/bin/bash -eu
php -r 'var_dump(file_get_contents($_SERVER["argv"][1]));' -- <(cat <<'SCRIPT'
<?php var_dump($_SERVER['argv']);
SCRIPT)
$ ./3.sh
PHP Warning:  file_get_contents(/dev/fd/63): failed to open stream: No such file or directory in Command line code on line 1

Warning: file_get_contents(/dev/fd/63): failed to open stream: No such file or directory in Command line code on line 1
bool(false)

第一个符号可能被 php 截断了:

$ type 4.sh
#!/bin/bash -eu
php <(cat <<SCRIPT
12
SCRIPT)
$ ./4.sh
2
$ type 5.sh
#!/bin/bash -eu
cat <(cat <<SCRIPT
12
SCRIPT)
$ ./5.sh
12

好吧,我想出了更简单的解决方案:

$ type 6.sh
#!/bin/bash -eu
cat | php -- 1 <<'SCRIPT'
<?php var_dump($_SERVER['argv']);
SCRIPT
$ ./6.sh
array(2) {
  [0]=>
  string(1) "-"
  [1]=>
  string(1) "1"
}

但这些疯狂是怎么回事?

Debian我在( php-5.4.14, bash-4.1.5) 和Arch Linux( php-5.4.12, )上运行测试bash-4.2.42

UPD我已经明确陈述了所有问题,见上文。

答案1

cat <(cat <<SCRIPT
{
SCRIPT)

您的此处文档应该以SCRIPT, 但您写了SCRIPT). shell 首先需要确定此处文档的结束位置,然后才能开始查找<(…)构造的右括号。将右括号放在单独的行上。

请注意,使用不带引号的此处文档标记,字符\`$将在此处文档内解释:shell 执行变量和命令替换。为了避免这种情况,请引用标记。

cat <(cat <<'SCRIPT'
{
SCRIPT
)

相关内容