BashスクリプトにPHPスクリプトを挿入すると、どのような問題が発生しますか?

BashスクリプトにPHPスクリプトを挿入すると、どのような問題が発生しますか?

内部bashスクリプトを使用しようとするとphpいくつかの問題が発生します。bashここにある文書の終わりが見つからないというエラーのため、最初の試みは失敗しました。それでもエラーを引き起こす最小バージョンは次のとおりです(UPDQ: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"
}

しかし、この狂気はすべてについて何ですか?

Debianphp-5.4.14bash-4.1.5)、Arch Linux(、)php-5.4.12に対してテストを実行していますbash-4.2.42

UPD私はすべての問題を明確に言及しました。上記を参照してください。

答え1

cat <(cat <<SCRIPT
{
SCRIPT)

hereドキュメントはで終わる必要がありますSCRIPTが、シェルは設定された閉じ括弧をSCRIPT)探し始める前に、最初にhereドキュメントが終わる場所を決定する必要があります。<(…)閉じ括弧を別の行に配置します。

引用符なしでheredocマークアップを使用すると、文字は\`$heredoc内で解釈されます。シェルは変数とコマンドの置換を行います。これを防ぐには、マークアップを引用してください。

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

関連情報