自动摘要
正在生成中……
今天发现一个奇怪的问题,如果我直接运行这条命令:
docker run -i --rm -v pwd:pwd falconchen/m2k-php-fpm:latest php -r "echo 123;"
会得到正确的输出,“123”,
但是如果我在 /usr/local/bin/php内写入
#!/bin/bash
docker run -i --rm -v `pwd`:`pwd` falconchen/m2k-php-fpm:latest php $@
保存并增加为可执行权限,运行 php -r "echo 123;" 将会报错:
PHP Parse error: syntax error, unexpected end of file in Command line code on line 1
Parse error: syntax error, unexpected end of file in Command line code on line 1
该如何修改?
这个错误是由于 $@ 的展开方式导致的。在 Bash 脚本中,$@ 如果没有被正确地用双引号包裹,会导致参数在传递过程中被错误地拆分。为了确保参数被正确传递,你需要在脚本中使用 "$@" 而不是 $@。
下面是修改后的 /usr/local/bin/php 脚本:
#!/bin/bash
docker run -i --rm -v `pwd`:`pwd` falconchen/m2k-php-fpm:latest php "$@"
请确保你保存了这个脚本,并给予其可执行权限:
chmod +x /usr/local/bin/php
现在,运行 php -r "echo 123;" 应该能够正确输出 123。
解释
-
"$@" 代表所有传递给脚本的参数,并保持它们的完整性(即每个参数仍然作为独立的参数)。
-
$@ 在没有双引号的情况下会将所有参数视为一个整体,并在参数包含空格或特殊字符时引起问题。
通过使用 "$@",可以确保 Docker 容器中的 php 命令能够正确接收到传递的参数,从而避免语法错误。