Eu estava tentando usar php
dentro do script bash, mas me deparei com vários problemas. Minha primeira tentativa falhou com erro sobre bash
não ser capaz de encontrar o fim de here-document. A versão mínima que ainda acionou o erro é a seguinte ( UPD P: Por que bash não pode ver o fim do marcador de documento aqui?):
$ 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 Criei perguntas separadas para o resto do post.
"Bem, eu posso evitar usar chaves então", eu decidi. Mas descobriu-se que o primeiro símbolo é cortado por algum motivo ( UPD Q: Quem e por qual razão corta o primeiro símbolo dos scripts? Tem alguma coisa a ver com uma BOM?):
$ type 2.sh
#!/bin/bash -eu
php <(cat <<'SCRIPT'
<?php var_dump($_SERVER['argv']);
SCRIPT)
$ ./2.sh
?php var_dump($_SERVER['argv']);
Depois tentei descobrir quem é o culpado ( UPD Q: Como abrir o arquivo substituído pelo processo do 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)
O primeiro símbolo provavelmente é cortado pelo 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
Bem, eu encontrei uma solução mais simples:
$ 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"
}
Mas o que há com toda essa loucura?
Eu executo os testes em Debian
( php-5.4.14
, bash-4.1.5
) e Arch Linux
( php-5.4.12
, bash-4.2.42
).
UPD Eu declarei explicitamente todas as perguntas, veja acima.