内部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"
}
しかし、この狂気はすべてについて何ですか?
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)
hereドキュメントはで終わる必要がありますSCRIPT
が、シェルは設定された閉じ括弧をSCRIPT)
探し始める前に、最初にhereドキュメントが終わる場所を決定する必要があります。<(…)
閉じ括弧を別の行に配置します。
引用符なしでheredocマークアップを使用すると、文字は\`$
heredoc内で解釈されます。シェルは変数とコマンドの置換を行います。これを防ぐには、マークアップを引用してください。
cat <(cat <<'SCRIPT'
{
SCRIPT
)