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"
}

하지만 이 광기는 다 무엇에 관한 것일까요?

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
)

관련 정보