我试图使用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
)