o que há de errado com a incorporação de scripts php dentro do bash?

1

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.

    
por x-yuri 02.05.2013 / 01:27

1 resposta

3
cat <(cat <<SCRIPT
{
SCRIPT)

Seu documento aqui deve terminar com SCRIPT , mas você escreveu SCRIPT) . O shell primeiro precisa determinar onde o documento here termina, antes que ele possa começar a procurar pelo parêntese de fechamento para a construção <(…) . Coloque o parêntese de fechamento em uma linha separada.

Note que com um marcador de documento não listado aqui, os caracteres \'$ são interpretados dentro do documento aqui: o shell executa substituições de comando e variável. Para evitar isso, cite o marcador.

cat <(cat <<'SCRIPT'
{
SCRIPT
)
    
por 02.05.2013 / 01:32